当我尝试更新现有实体时,我遇到了一个奇怪的问题。
public void Update(VisitDTO item)
{
using (var ctx = new ReceptionDbContext())
{
var entityToUpdate = ctx.Visits.Attach(new Visit { Id = item.Id });
var updatedEntity = Mapper.Map<Visit>(item);
ctx.Entry(entityToUpdate).CurrentValues.SetValues(updatedEntity);
ctx.SaveChanges();
}
这是我的更新方法。 在enity访问中我获得了一些bool值,但是我不能将它们设置为false,当它从false更新为true时它没关系但是当我需要从true更改为false时实体不会更新这些bools值,其他属性正确更新
答案 0 :(得分:2)
问题是默认(bool)== false。
var entityToUpdate = ctx.Visits.Attach(new Visit { Id = item.Id });
与
相同 var entityToUpdate = ctx.Visits.Attach(new Visit
{
Id = item.Id,
AnyBool = false // default(bool)
});
Attach将所有字段设置为UNCHANGED状态。
EntityFramework假定新的Visit对象包含正确的值(即使它没有)。忽略将AnyBool更新为false,因为EF认为它已经是假的!
对于要修改的字段,您需要手动将状态更改为MODIFIED:
ctx.Entry(entityToUpdate).State = EntityState.Modified; // all fields
ctx.Entry(entityToUpdate).Property(x => x.AnyBool).IsModified = true; // one field