繁体   English   中英

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

[英]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

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

对象以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工具箱中一个功能强大的小工具,可以帮助提高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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM