这段代码实际上无法保存任何更改:

//
// POST: /SomeType/Edit/5

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, SomeType Model)
{
    db.AttachTo(Model.GetType().Name, Model);
    db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
    db.SaveChanges();
    return RedirectToAction("Index");
}


ASP.NET MVC将对象模型创建为EntityState值为Detached的Department类型EntityObject。

使用AttachTo方法后,其EntityState保持不变。

MSDN on Attaching Objects (Entity Framework)


  对象已附加到对象
  上下文保持不变。


由于其状态未更改,因此ApplyPropertyChanges方法不执行任何操作。

我希望它改为具有修改状态。

MSDN on EntityState Enumeration


  独立式
  该对象存在,但未被对象跟踪
  服务。实体处于此状态
  创建后立即
  并且在将其添加到对象之前
  上下文。实体也在此
  从中移除后的状态
  通过调用分离上下文
  方法,或者是否使用
  NoTrackingMergeOption。
  
  不变的
  自从将对象加载到对象以来,尚未对其进行修改
  上下文或自上次以来
  SaveChanges方法是
  叫。
  
  改性
  对象已更改,但SaveChanges方法尚未更改
  被称为。


我无法将EntityObject的EntityState属性显式设置为Modified。它是只读的。

具有EntityObjects的强类型MVC控制器是否不可能?

最佳答案

您需要从ObjectContext获取ObjectStateManager。使用ObjectStateManager,可以显式设置对象的状态,而无需调用数据库:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, SomeType Model)
{
    db.AttachTo(Model.GetType().Name, Model);

    ObjectStateManager stateMgr = db.ObjectStateManager;
    ObjectStateEntry stateEntry = stateMgr.GetObjectStateEntry(model);
    stateEntry.SetModified(); // Make sure the entity is marked as modified
    //db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);

    db.SaveChanges();
    return RedirectToAction("Index");
}


ObjectStateEntry还允许您通过SetModifiedProperty应用更细粒度的状态更改数据。如果调用SetModified,EF将把整个实体视为已修改,并将每个属性持久保存到数据存储中。借助SetModifiedProperty,EF可以优化查询,并且仅涉及实际已更改的属性。使用SetModifiedProperty显然要复杂得多,因为您通常需要知道每个属性的原始值。

我希望这有帮助。 ObjectStateManager是EF工具箱中一个功能强大的小型工具,可以帮助提高EF v1.0否则的性能和效率。

07-24 13:05