具有断开连接的实体的实体框架奇怪的更新行为

时间:2014-11-30 15:51:02

标签: c# .net entity-framework

这是一个说明问题的样本

人必须具有PersonType

HasRequired(o => o.PersonType).WithMany(o => o.Persons);

然后使用断开连接的实体。当我这样做时,

   //Person with ID=4 exists in DB
     Person p = new Person() { PersonId = 4, PersonType= null, Address = ... };                

    //PersonType is null here              
    using (var ctxNew = new Context())
    {
       var entry = ctxNew.Entry(p);
       entry.State = System.Data.Entity.EntityState.Modified;
       ctxNew.SaveChanges(); //Ok. But shouldn't be
    }

由于某种原因,SaveChanges()成功而没有错误。但据我所知,它应该无法验证。这对我来说是一个问题,因为我从服务层获取这样的对象,我不希望它们无声地失败。这里的问题是什么?

1 个答案:

答案 0 :(得分:1)

这里的问题是:当你这样做时:

entry.State = System.Data.Entity.EntityState.Modified;

EF标记为仅修改指定的实体。如果您的实体具有其他相关实体(例如' PersonType' navigation属性),它们将保持未更改状态,并且不会在SaveChanges方法调用上发送到数据库(并且未经过验证)。

对于此类属性,您可以通过调用SetModifiedProperty方法将其状态更改为“修改”:

entry.SetModifiedProperty("PersonType");