带有实体框架的强类型ASP.NET MVC

Zac*_*son 2 .net c# asp.net asp.net-mvc entity-framework

此代码无法实际保存任何更改:

//
// 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");
}
Run Code Online (Sandbox Code Playgroud)

ASP.NET MVC将对象Model创建为Department类型EntityObject,其EntityState值为Detached.

使用AttachTo方法后,其EntityState变为Unchanged.

附加对象的MSDN(实体框架)

对象以Unchanged状态附加到对象上下文.

由于其Unchanged状态,ApplyPropertyChanges方法不执行任何操作.

我希望它具有状态修改.

关于EntityState枚举的MSDN

已分离
对象存在但对象服务未对其进行跟踪.在创建实体并将其添加到对象上下文之前,实体立即处于此状态.通过调用Detach方法或使用NoTrackingMergeOption加载实体后,实体也处于此状态.

未更改
对象未被修改,因为它已加载到上下文中或自上次调用SaveChanges方法以来.

已修改
对象已更改,但尚未调用SaveChanges方法.

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

使用EntityObjects的强类型MVC控制器是不是不可能?

jri*_*sta 8

您需要从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");
}
Run Code Online (Sandbox Code Playgroud)

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

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