我有这个实体,想要使用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.
我不知道我在这里缺少什么。请告诉我。
答案 0 :(得分: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);
或者,手动(我会避免这样做,但仅仅是为了完整性):
// 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绝对是最简单的方法之一。
答案 1 :(得分: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();
仅在sql update语句中修改了值
Update Employee set FirstName='modifiedValue', Email='modifiedValue' where Id=1138.
如果有人知道比这更好的答案,请发表您的建议
答案 2 :(得分:0)
您可以尝试这种方式
public update(Person model)
{
// Here model is model return from form on post
var oldobj = db.Person.where(x=>x.ID = model.ID).SingleOrDefault();
var UpdatedObj = (Person) Entity.CheckUpdateObject(oldobj, model);
db.Entry(oldobj).CurrentValues.SetValues(UpdatedObj);
}
public static object CheckUpdateObject(object originalObj, object updateObj)
{
foreach (var property in updateObj.GetType().GetProperties())
{
if (property.GetValue(updateObj, null) == null)
{
property.SetValue(updateObj,originalObj.GetType().GetProperty(property.Name)
.GetValue(originalObj, null));
}
}
return updateObj;
}