不跟踪EF4实体的单个属性

时间:2012-07-09 04:52:27

标签: asp.net-mvc-3 entity-framework entity-framework-4 objectcontext

我的MVC操作方法接收默认模型绑定器从表单集合数据创建的实体对象(Page)。一些字段是错误的或为null,因为它们没有在请求中发送到服务器,例如我不发送“CreateDate”并且默认模型绑定器将此属性设置为某个默认值,我不这样做需要。

一旦附加了对象,它当然会尝试将所有值(包括无效/不需要的值)保存到数据库中。我当然可以基于每个属性手动分配但是想知道我是否可以以某种方式标记属性,因此当EntityState设置为modified并且调用SaveChanges()时它不会被持久化。

public ActionResult SomeMethod(Page page)
{
page.ModifyDate = DateTime.Now;

       _db.NewsPages.Attach(page);
                _db.ObjectStateManager.ChangeObjectState(page, System.Data.EntityState.Modified);
                _db.SaveChanges();
                _db.Dispose();

}

1 个答案:

答案 0 :(得分:0)

处理此问题的正确方法是在视图模型中使用不同的类,将空实体附加到上下文并为每个属性分配实际值(或让AutoMapper处理此方案),如@Darin在评论中建议的那样。

如果您想按照自己的方式行事,则不得更改POCO实体的状态,但必须更改每个已更改属性的状态:

public ActionResult SomeMethod(Page page)
{
    page.ModifyDate = DateTime.Now;

    _db.NewsPages.Attach(page);
    ObjectStateEntry entry = _db.ObjectStateManager.GetObjectStateEntry(page);
    entry.SetModifiedProperty("ChangedPropertyName");
    // Do the same for all other changed properties
    _db.SaveChanges();
    _db.Dispose();
}