我有一个实体,需要在其上跟踪员工工资率的历史记录。 employeeRate对象是:
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;
}
因此,为了跟踪历史记录,当我“更新”员工费率时,我使用其ID检索所有旧记录并将ActiveFlag设置为false,然后添加具有新工资率且ActiveFlag设置为true的新实体。以下是此操作的功能:
employeerates
当我对DbContext对象执行添加操作时,EntityFramework生成的SQL会因某种原因删除该员工的所有旧记录。
生成的SQL:
DELETE FROM
EmployeeRateId
WHEREemployeerates
= @ p0;INSERT INTO
ActiveFlag
(CreateStamp
,EmployeeId
,LastModifiedBy
,Rate
,UpdateStamp
,EmployeeRateId
)VALUES(@ p1,@ p2,@ p3,@ p4, @ p5,@ p6); SELECTemployeerates
FROMEmployeeRateId
WHERE ROW_COUNT()= 1 AND {{1}} = LAST_INSERT_ID();
为什么会这样?有没有办法让EF不删除这些旧记录?
修改
我正在使用asp.net核心和实体框架核心。
答案 0 :(得分:1)
准备叫我傻......
由于我想跟踪EmployeeRate对象的历史记录,我错误地想到了Employee和EmployeeRate之间的关系。这是我原来的员工对象(我应该最初发布):
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认为它是一对一的,因此它删除了具有相同引用的所有其他记录。它实际上是“一对多”&#34;只有一个费率&#34;活跃&#34;一次。因此,EmployeeRate导航属性需要作为列表或集合引用,以便EF正常工作而不删除旧记录。愚蠢的我;)