使用实体框架键入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使用EntityState值为Detached将对象Model创建为部门类型EntityObject。

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

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

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

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

我希望它改为state Modified

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());
    }
}

}


这工作:

//
// 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");
}

但是有没有查询数据库的方法?

链接地址: http://www.djcxy.com/p/5727.html

上一篇: Typed ASP.NET MVC with Entity Framework

下一篇: Entity Framework vs LINQ to SQL