实体框架验证在未使用的属性更新时失败

时间:2017-05-17 12:59:30

标签: c# .net entity-framework

我有一个我似乎无法理解的问题,更不用解决了。任何帮助将不胜感激。

所以我有一个MVC应用程序,实体框架,通常。我有一个可以更新一个实体的一个属性的请求。此请求发送实体的Id和属性的新值。

为了避免查询实体的数据库,并且由于我只想对该属性进行更新然后返回,我将新实体附加到具有id的上下文,然后设置{{1} }。像这样:

private bool _handle = true;
private void dg2_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
    if (_handle)
    {
        _handle = false;
        dg2.CommitEdit();
        var text = e.Row.Item as Skill;
        //...
        _handle = true;
    }
}

然后,可以这样使用:CurrentValue; 其中public class MyEntityHandler { // dbContext is my EF context, instantiated from a DI container // ... public void UpdateProperty<TProp>(MyEntity entity, Expression<Func<MyEntity , TProp>> property, TProp value) { var memberName=(property.Body as MemberExpression).Member.Name; var temp = dbContext.ChangeTracker.Entries<MyEntity>() .SingleOrDefault( o => o.Entity.Id == entity.Id ); if( temp == null || temp.State == EntityState.Detached) { dbContext.MyEntities.Attach( entity ); } this.dbContext.Entry(entity).Property(memberName).IsModified = true; this.dbContext.Entry(entity).Property(memberName).CurrentValue = value; } } 的类型为UpdateProperty(e, e=>e.Prop, "NewValue")e是其中的字符串属性。 当post请求进来时,我只是创建一个新的MyEntity,我分配id然后调用此方法。像这样的东西(还有几层,但对我的问题没什么影响):

Prop

我的理解是,在这种情况下,EF应该将实体附加在未更改状态。在我的情况下,实体不在上下文中,并且附加成功。然后我更新了一个单独的属性,它将实体置于MyEntity状态,因此应在public ActionResult MyMethod(int id, string newValue) { var e=new MyEntity { MyEntityId=id }; new MyEntityHandler().UpdateProperty(e,e=>e.Prop,newValue); return View(); } 上生成更新语句。由于只更改了一个属性,因此该属性应该是update语句中唯一的属性。我仔细检查了Modified中的值,我可以看到实体被修改并且属性被修改,但是其他所有属性都没有被修改。

问题在于,当我调用SaveChanges()时,我得到ChangeTracker,因为其他属性之一为null,但它具有SaveChanges()属性。这是完全正确的 - 因为我附加一个新实体并在附加之前只设置id,它应该为null。我只是不理解验证错误 - 我没有尝试将该值插入数据库(同样,我检查了ChangeTracker并修改了实体的状态,并且未修改相关属性) 。

为什么我会收到此验证错误?这是设计的吗?有没有办法告诉EF让这个保存(没有在上下文中禁用验证altogerher)?

0 个答案:

没有答案