為什麼Entity Framework(Core)在Add()操作中刪除舊記錄?

asp.net-core c# entity-framework entity-framework-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; }
}

因此,為了跟踪歷史記錄,當我“更新”員工費率時,我使用其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;
} 

當我對我的DbContext對象執行添加操作時,EntityFramework生成的SQL會因某種原因刪除該員工的所有舊記錄。
生成的SQL:

DELETE FROM employeerates WHERE EmployeeRateId = @ p0;

INSERT INTO employeeratesActiveFlagCreateStampEmployeeIdLastModifiedByRateUpdateStamp )VALUES(@ p1,@ p2,@ p3,@ p4,@ p5,@ p6); SELECT EmployeeRateId FROM employeerates WHERE ROW_COUNT()= 1 AND EmployeeRateId = LAST_INSERT_ID();

為什麼會這樣?有沒有辦法讓EF不刪除這些舊記錄?

編輯

我使用的是asp.net核心和實體框架核心。

一般承認的答案

準備叫我傻...

由於我想跟踪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; }
    }

你們中的一些人可能會立即看到這個問題。 EmployeeRate引用實際上必須是這樣的:

public virtual List<EmployeeRate> EmployeeRates { get; set; }

因為它實際上是一對多的關係。由於我的想法只是每個員工只需要一個費率,我之前只有一個單一的參考(就EF而言,它是一對一的)。因此,當我更新引用時,EF認為它是一對一的,所以它刪除了具有相同引用的所有其他記錄。它實際上是“一對多”,一次只有一個“有效”速率。因此,EmployeeRate導航屬性需要作為列表或集合引用,以便EF正常工作而不刪除舊記錄。愚蠢的我 ;)



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow