gpt4 book ai didi

entity-framework - 如何仅更新修改后的值(EntityFramework 5.0)?

转载 作者:行者123 更新时间:2023-12-04 05:25:01 24 4
gpt4 key购买 nike

我有这个实体,想使用entityframework更新

 EmployeeModel employee = new EmployeeModel
{
Id = 1000, //This one must
FirstName = modifiedValue,
Email = modifiedValue,
LastName = originalValue,
Phone = originalValue
};

代码更新
_db.ObjectStateManager.ChangeObjectState(employee, EntityState.Modified);  
_db.SaveChanges();

这是一次更新的SQL语句
Update Employee set Id=1138,FirstName='modifiedValue',Email='modifiedValue',LastName= 'OriginalValue',phone='originalValue' where Id=1138

但是我期待这个
Update Employee set FirstName='modifiedValue', Email='modifiedValue' where Id=1138.

我不知道我在这里想念的是什么。请告诉我。

最佳答案

在处理DTO时,此问题很常见。从数据库中获取一个雇员实体,将其映射到DTO并通过网络发送。然后,客户端修改此DTO并将其发送回服务器。

当您触摸(设置)EF实体上的属性时,EF将假定该值已更改。即使旧值和新值完全相同。
当您将DTO映射到新的实体并将其附加到EF并将其状态更新为“已修改”时,会发生相同的问题。

使用AutoMapper:

// This will result in the full update statement
var employee = AutoMapper.Mapper.Map<EmployeeDto, Employee>(dto);

// This will result in a smaller update statement (only actual changes)
var employee = dbContext.Employees.Find(dto.Id);
AutoMapper.Mapper.Map(dto, employee);

或者,手动(我会避免这样做,但仅出于完整性考虑):
// This will result in a smaller update statement (only actual changes)
var employee = dbContext.Employees.Find(dto.Id);
if (employee.Email != dto.Email )
employee.Email = dto.Email;

可能还有其他方法可以解决此问题……但是,正确地将AutoMapper与Entity Framework一起使用绝对是最简单的方法之一。

关于entity-framework - 如何仅更新修改后的值(EntityFramework 5.0)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627999/

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