在ASP MVC Web应用程序中充分利用Entity Framework

时间:2011-04-07 20:59:05

标签: entity-framework asp.net-mvc-3 entity-framework-4

如何在我的ASP MVC3 Web应用程序中充分利用我的Entity Framework(v4.0或更高版本)?我的主要问题是由于Web的请求 - 响应性质,似乎我必须手动跟踪表单上显示的对象到DB以进行CUD操作。例如。正如Editing and Updating Entity Framework entity in ASP .NET MVC中所建议的那样,这看起来很糟糕。有没有办法在我的会话中保留我的上下文,以及EF如何为我做所有的工作?

1 个答案:

答案 0 :(得分:2)

不要将ObjectContext存储在会话中。为每个请求处理使用新上下文。在这里,您可以阅读有关long living contexts的内容。如果您使用存储在会话中的长生活上下文,则加载新数据将会遇到很大问题。此外,如果您的用户在多个浏览器选项卡中打开您的应用程序(=同一会话),您可能会得到一些非常意外的结果。

如果您只想更新标量值(导航属性没有变化),您可以使用:

插入方案:

[HttpPost]
public ActionResult Insert(MyEntity entity)
{
    using (var context = new MyContext())
    {
        context.MyEntities.AddObject(entity);
        context.SaveChanges(); 
    }

    ...
}

使用完全分离的对象更新方案:

[HttpPost]
public ActionResult Update(MyEntity entity)
{
    using (var context = new MyContext())
    {
        context.MyEntities.Attach(entity);
        context.ObjectStateManager.ChangeObjecState(entity, EntityState.Modified);
        context.SaveChanges(); 
    }

    ...
}

首先从DB中加载对象更新方案:

[HttpPost]
public ActionResult Update(MyEntity entity)
{
    using (var context = new MyContext())
    {
        int id = entity.Id;
        context.MyEntities.Single(e => e.Id == id); // You must load the record first
        context.MyEntities.ApplyCurrentValues(entity);
        context.SaveChanges(); 
    }

    ...
}

删除方案:

[HttpPost]
public ActionResult Delete(int id)
{
    using (var context = new MyContext())
    {
        var entity = context.MyEntities.Single(e => e.Id == id);
        context.MyEntities.DeleteObject(entity);
        context.SaveChanges(); 
    }

    ...
}

可以在不加载实体的情况下删除实体,但如果实体有任何关系则会造成很多麻烦。

如果您想要修改关系,也可以使用UpdateMode / TryUpdateModel讨论here或按照here手动跟踪更改。 Foreign key association上的简单关系更新(即使您不使用代码优先,描述也相同)仍然可以通过前面的示例处理。