我使用的是存储库模式,我的更新方法如下所示:
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;
}
我首先获取实体,然后对属性进行更改,然后更新实体。在这种情况下,条目的状态永远不会Detached
,因此永远不会调用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表现得像这样?
答案 0 :(得分:3)
这一行:
dbEntityEntry.State = EntityState.Modified;
您告诉实体框架该实体已被修改。无论它是否真的被修改过。
因此,EF发送一条带有所有实体字段的SQL语句进行更新。
答案 1 :(得分:-1)
所有你需要的是:
public virtual void Update(T entity)
{
DbSet.Attach(entity);
DbSetFactory.ChangeEntityState(entity, EntityState.Modified);
}