Asp.net mvc 3 不跟踪EF4实体的单个属性

Asp.net mvc 3 不跟踪EF4实体的单个属性,asp.net-mvc-3,entity-framework,entity-framework-4,objectcontext,Asp.net Mvc 3,Entity Framework,Entity Framework 4,Objectcontext,我的MVC操作方法接收默认模型绑定器从表单集合数据创建的实体对象(页面)。某些字段错误或为空,因为它们没有在请求中发送到服务器,例如,我没有发送“CreateDate”,默认模型绑定器将此属性设置为我不需要的某个默认值 一旦对象被附加,它当然会尝试将所有值(包括无效/不需要的值)持久化到数据库中。当然,我可以在每个属性的基础上手动分配,但我想知道是否可以以某种方式标记一个属性,以便在EntityState设置为modified并调用SaveChanges()时,该属性不会持久化 public A

我的MVC操作方法接收默认模型绑定器从表单集合数据创建的实体对象(页面)。某些字段错误或为空,因为它们没有在请求中发送到服务器,例如,我没有发送“
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();

}

正确的处理方法是为视图模型使用不同的类,将空实体附加到上下文中,并按照@Darin在注释中的建议为每个属性分配实际值(或者让AutoMapper处理此场景)

如果您想按自己的方式进行,则不得更改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();
}

为什么不使用视图模型?在正确设计的应用程序中,控制器操作应将视图模型作为参数,而不是域模型。然后将视图模型映射到域模型并持久化。