[英]Strongly-Typed ASP.NET MVC with 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");
}
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");
}
ObjectStateEntry还允许您通过SetModifiedProperty应用更细粒度的状态更改数据。 如果调用SetModified,EF会将整个实体视为已修改,并将每个属性保留到数据存储中。 使用SetModifiedProperty,EF可以优化查询,并且只涉及实际更改的属性。 使用SetModifiedProperty显然更复杂,因为您通常需要知道每个属性的原始值。
我希望这有帮助。 ObjectStateManager是EF工具箱中一个功能强大的小工具,可以帮助提高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());
}
}
}
我有这个工作,但我无法得到的是SalesOrderDetail的父实体我怎么能得到它?
SalesOrderDetail.SalesOrderHead为null,并且entityreference为null。 我的编辑例程只能访问SalesOrderDetail的id。
谢谢斯里兰卡
这有效:
//
// 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");
}
国家改变了吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.