Asp.net mvc 3 不跟踪EF4实体的单个属性
我的MVC操作方法接收默认模型绑定器从表单集合数据创建的实体对象(页面)。某些字段错误或为空,因为它们没有在请求中发送到服务器,例如,我没有发送“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
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();
}
为什么不使用视图模型?在正确设计的应用程序中,控制器操作应将视图模型作为参数,而不是域模型。然后将视图模型映射到域模型并持久化。