我正在使用存储库模式,我的更新方法如下所示:
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = dataContext.GetEntry(entity);
if (dbEntityEntry.State == EntityState.Detached)
{
dbSet.Attach(entity);
}
string d1 = dbEntityEntry.CurrentValues.GetValue<string>("Description");
string d2 = dbEntityEntry.OriginalValues.GetValue<string>("Description");
bool b = d1 == d2;
dbEntityEntry.State = EntityState.Modified;
}
我首先获取实体,然后对属性进行更改,然后更新实体.在这种情况下,条目的状态永远不会被分离,因此从不调用Attach().
如果我更改Description属性,我可以看到原始值和当前值不同.如果属性保持不变,则原始值和当前值都相同.
GetEntry只是我的DBContext中的包装器方法:
public DbEntityEntry GetEntry(object entity)
{
return base.Entry(entity);
}
我的控制器动作如下所示:
public IHttpActionResult Update(int id, CustomerTypeDTO customerTypeDto)
{
var entity = customerTypeService.Get(id);
entity.Number = customerTypeDto.Number;
entity.Description = customerTypeDto.Description;
entity = customerTypeService.Save(entity);
return Ok<CustomerTypeDTO >(Mapper.Map<CustomerTypeDTO >(entity));
}
但是,EF发送一个SQL语句,其中包含所有实体的更新字段,如果它们已更改则无关紧要.
为什么EF表现得像这样?
最佳答案 有了这条线:
dbEntityEntry.State = EntityState.Modified;
您告诉实体框架该实体已被修改.无论它是否真的被修改过.
因此,EF发送一个SQL语句,其中包含所有实体的字段以进行更新.