为什么Entity Framework(Core)在Add()操作中删除旧记录?

big*_*ter 6 c# entity-framework entity-framework-core asp.net-core

我有一个实体,需要在其上跟踪员工工资率的历史记录.employeeRate对象是:

public class EmployeeRate : BaseEntity
{
    [Key]
    public int EmployeeRateId { get; set; }

    public int EmployeeId { get; set; }

    public double Rate { get; set; }
}

public class BaseEntity
{
    public bool ActiveFlag { get; set; }

    public DateTime CreateStamp { get; set; }

    public DateTime UpdateStamp { get; set; }

    public string LastModifiedBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

因此,为了跟踪历史记录,当我"更新"员工费率时,我使用其ID检索所有旧记录并将ActiveFlag设置为false,然后添加具有新工资率且ActiveFlag设置为true的新实体.这是我的这个操作的功能:

private EmployeeRate UpdateRate(EmployeeRate model, string currentUser)
{
    var existingRates = _context.EmployeeRates.Where(r => r.EmployeeId == model.EmployeeId).ToList();
    foreach(var rate in existingRates)
    {
        rate.ActiveFlag = false;
        rate.UpdateStamp = DateTime.UtcNow;
        rate.LastModifiedBy = currentUser;
    }
    _context.SaveChanges();

    var newRate = new EmployeeRate()
    {
        EmployeeId = model.EmployeeId,
        Rate = model.Rate,
        ActiveFlag = true,
        CreateStamp = DateTime.UtcNow,
        UpdateStamp = DateTime.UtcNow,
        LastModifiedBy = currentUser
    };

    newRate = _context.EmployeeRates.Add(newRate).Entity;
    _context.SaveChanges();

    return newRate;
} 
Run Code Online (Sandbox Code Playgroud)

当我对我的DbContext对象执行添加操作时,EntityFramework生成的SQL会因某种原因删除该员工的所有旧记录.
生成的SQL:

DELETE FROM employeeratesWHERE EmployeeRateId= @ p0;

INSERT INTO employeerates(ActiveFlag,CreateStamp,EmployeeId, LastModifiedBy,Rate,UpdateStamp)VALUES(@ P1,P2 @,@ P3,P4 @,@ P5,P6 @); SELECT EmployeeRateIdFROM employeeratesWHERE ROW_COUNT()= 1 AND EmployeeRateId= LAST_INSERT_ID();

为什么会这样?有没有办法让EF不删除这些旧记录?

编辑

我正在使用asp.net核心和实体框架核心.

big*_*ter 3

准备好骂我傻子吧……

由于我想要跟踪 EmployeeRate 对象的历史记录,因此我错误地考虑了 Employee 和 EmployeeRate 之间的关系。这是我原来的 Employee 对象(我本来应该发布的):

    public class Employee : BaseEntity
    {
        public int EmployeeId { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string Email { get; set; }

        public string PhoneNumber { get; set; }

        public int HomeLocationId { get; set; }




        //Navigation Properties
        public virtual Location HomeLocation { get; set; }

        public virtual EmployeeRate EmployeeRate { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

你们中的一些人可能会立即看到问题所在。EmployeeRate 参考实际上必须是这样的:

public virtual List<EmployeeRate> EmployeeRates { get; set; }
Run Code Online (Sandbox Code Playgroud)

因为它实际上是一对多的关系。由于我的想法是每位员工只需要一个费率,因此我之前只有单一参考(就 EF 而言,是一对一的)。因此,当我更新引用时,EF 认为它是一对一的,因此它删除了具有相同引用的所有其他记录。它实际上是“一对多”,一次只有一个速率“活动”。因此,EmployeeRate 导航属性需要作为 List 或 Collection 进行引用,以便 EF 正常工作并且不会删除旧记录。愚蠢的我 ;)