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

siv*_*vaL 8 entity-framework c#-4.0 entity-framework-5

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

 EmployeeModel employee = new EmployeeModel
    {
        Id = 1000, //This one must 
        FirstName = modifiedValue,
        Email = modifiedValue, 
        LastName = originalValue,
        Phone = originalValue
    };
Run Code Online (Sandbox Code Playgroud)

要更新的代码

_db.ObjectStateManager.ChangeObjectState(employee, EntityState.Modified);  
_db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

这是一旦更新的SQL语句

Update Employee set Id=1138,FirstName='modifiedValue',Email='modifiedValue',LastName= 'OriginalValue',phone='originalValue' where Id=1138
Run Code Online (Sandbox Code Playgroud)

但我期待着这一点

Update Employee set FirstName='modifiedValue', Email='modifiedValue' where Id=1138.
Run Code Online (Sandbox Code Playgroud)

我不知道我在这里缺少什么.请告诉我.

deh*_*rch 10

处理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);
Run Code Online (Sandbox Code Playgroud)

或者,手动(我会避免这样做,但只是为了完整性):

// 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;
Run Code Online (Sandbox Code Playgroud)

可能还有其他一些方法可以解决这个问题...但正确使用AutoMapper和Entity Framework绝对是最简单的方法之一.


siv*_*vaL 6

这是我得到的解决方案

 var entity = _db.CreateObjectSet<Employee>();
 entity.Detach(employee);
 entity.Attach(employee);

 foreach (string modifiedPro in employeeModel.ModifiedProperties){
  _db.ObjectStateManager.GetObjectStateEntry(employee).SetModifiedProperty(modifiedPro);}

  _db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

仅在sql update语句中修改了值

Update Employee set FirstName='modifiedValue', Email='modifiedValue' where Id=1138.
Run Code Online (Sandbox Code Playgroud)

如果有人知道比这更好的答案,请发表您的建议