带有entity framework的强类型ASP.NET MVC

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

// // 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将对象Model创建为Department类型EntityObject,其EntityState值为Detached

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

附加对象的MSDN(entity framework)

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

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

我想让它改为状态。

关于EntityState枚举的MSDN

超脱
该对象存在但对象服务未对其进行跟踪。 在创建实体并将其添加到对象上下文之前,实体立即处于此状态。 通过调用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"); } 

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

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

我发现以上所有内容似乎都不适用于我,但是MSDN指南示例确实是从上下文中获取原始项目的位置,然后附加更新的项目。

第二个例子:

http://msdn.microsoft.com/en-us/library/bb896248.aspx#Mtps_DropDownFilterText

 private static void ApplyItemUpdates(SalesOrderDetail updatedItem){ // Define an ObjectStateEntry and EntityKey for the current object. EntityKey key; object originalItem; using (AdventureWorksEntities advWorksContext = new AdventureWorksEntities()) { try { // Create the detached object's entity key. key = advWorksContext.CreateEntityKey("SalesOrderDetail", updatedItem); // Get the original item based on the entity key from the context // or from the database. if (advWorksContext.TryGetObjectByKey(key, out originalItem)) { // Call the ApplyPropertyChanges method to apply changes // from the updated item to the original version. advWorksContext.ApplyPropertyChanges( key.EntitySetName, updatedItem); } advWorksContext.SaveChanges(); } catch (InvalidOperationException ex) { Console.WriteLine(ex.ToString()); } } 

}

这有效:

 // // POST: /SomeType/Edit/5 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(Guid id, SomeType Model) { Model.EntityKey = (from SomeType s in db.SomeType where s.Id == id select s).FirstOrDefault().EntityKey; db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model); db.SaveChanges(); return RedirectToAction("Index"); } 

但有没有办法不查询数据库?

如果添加一行会发生什么:

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

国家改变了吗?

我有这个工作,但我无法得到的是SalesOrderDetail的父实体我怎么能得到它?

SalesOrderDetail.SalesOrderHead为null,并且entityreference为null。 我的编辑例程只能访问SalesOrderDetail的id。

谢谢斯里兰卡