gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:53:05 28 4
gpt4 key购买 nike

我有一个实体需要跟踪其员工工资率的历史记录。 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 employeerates (ActiveFlag, CreateStamp, EmployeeId, LastModifiedBy, Rate, UpdateStamp) VALUES (@p1, @p2, @p3, @p4, @p5, @p6); SELECT EmployeeRateId FROM employeerates WHERE ROW_COUNT() = 1 AND EmployeeRateId=LAST_INSERT_ID();

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

编辑

我正在使用 asp.net 核心和 Entity Framework 核心。

最佳答案

准备好说我傻...

由于我想跟踪 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 导航属性需要作为 List 或 Collection 引用,以便 EF 正常工作并且不删除旧记录。愚蠢的我;)

关于c# - 为什么 Entity Framework (Core) 在 Add() 操作中删除旧记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41049062/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com