在实体框架更新方法中无法将bool值设置为false

时间:2018-01-17 11:56:07

标签: c# entity-framework

当我尝试更新现有实体时,我遇到了一个奇怪的问题。

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值,其他属性正确更新

1 个答案:

答案 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

请参阅How to update only one field in Entity Framework?