Entity framework 在ASP MVC web应用程序中充分利用实体框架

Entity framework 在ASP MVC web应用程序中充分利用实体框架,entity-framework,asp.net-mvc-3,entity-framework-4,Entity Framework,Asp.net Mvc 3,Entity Framework 4,如何在ASP MVC3 web应用程序中充分利用实体框架(v4.0或更高版本)?我的主要问题是由于web的请求-响应特性,似乎我必须手动跟踪表单上显示的对象到DB,以便执行CUD操作。正如这本手册中所建议的那样,这似乎是一本非常糟糕的手册。有没有办法在我的会话中保留我的上下文?EF是如何为我完成所有工作的?不要在会话中存储ObjectContext。为每个请求处理使用新上下文。在这里你可以读到一些关于。如果您使用存储在会话中的长期生存上下文,那么加载新数据将有一个大问题。此外,如果用户在多个浏览

如何在ASP MVC3 web应用程序中充分利用实体框架(v4.0或更高版本)?我的主要问题是由于web的请求-响应特性,似乎我必须手动跟踪表单上显示的对象到DB,以便执行CUD操作。正如这本手册中所建议的那样,这似乎是一本非常糟糕的手册。有没有办法在我的会话中保留我的上下文?EF是如何为我完成所有工作的?

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

如果只想更新标量值(不更改导航属性),可以使用:

插入场景:

[HttpPost]
public ActionResult Insert(MyEntity entity)
{
    using (var context = new MyContext())
    {
        context.MyEntities.AddObject(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(); 
    }

    ...
}
使用完全分离的对象更新场景:

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

    ...
}
首先从数据库加载对象时更新场景:

[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 Insert(MyEntity entity)
{
    using (var context = new MyContext())
    {
        context.MyEntities.AddObject(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
,或者按照所述手动跟踪更改。上的简单关系更新(即使不首先使用代码,说明也相同)仍然可以由前面的示例处理。

如何在使用“完全分离对象的更新方案”和“首先从数据库加载对象的更新方案”之间进行选择?似乎我所要做的就是在我的对象上设置一个IsNew标志,以确定是否应该对每个对象使用.Add()或ApplyCurrentValues()。这取决于您的偏好。加载对象表单DB的场景有到数据库的额外往返,但在任何情况下都有效。在修改对象和独立关联时,分离的场景可能会出现严重问题。在EF4中,最好使用find()而不是使用single或first来加载当前实体(基本上是find()=tryupdatemodel)@ashraf:据我所知,
find
仅在DbContext API=EF 4.1中可用。EFv4中也存在相同的方法,称为
GetObjectByKey
,但必须将实体键作为参数传递,这对于POCOs来说并不容易。以下是一些例子: