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.
对象以Unchanged状态附加到对象上下文.
由于其Unchanged状态,ApplyPropertyChanges方法不执行任何操作.
我希望它具有状态修改.
已分离
对象存在但对象服务未对其进行跟踪.在创建实体并将其添加到对象上下文之前,实体立即处于此状态.通过调用Detach方法或使用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");
}
Run Code Online (Sandbox Code Playgroud)
ObjectStateEntry还允许您通过SetModifiedProperty应用更细粒度的状态更改数据.如果调用SetModified,EF会将整个实体视为已修改,并将每个属性保留到数据存储中.使用SetModifiedProperty,EF可以优化查询,并且只涉及实际更改的属性.使用SetModifiedProperty显然更复杂,因为您通常需要知道每个属性的原始值.
我希望这有帮助.ObjectStateManager是EF工具箱中一个功能强大的小工具,可以帮助提高EF v1.0的病态性能和效率.
| 归档时间: |
|
| 查看次数: |
4910 次 |
| 最近记录: |