Asp.net mvc 实体框架上下文?

Asp.net mvc 实体框架上下文?,asp.net-mvc,entity-framework-4,repository-pattern,unit-of-work,Asp.net Mvc,Entity Framework 4,Repository Pattern,Unit Of Work,我真的很难找到在MVC应用程序中管理EF上下文的位置 我正在使用Service/Repository/EF方法,并在其中使用UnitOfWork模式和上下文,然后在控制器操作中使用它来利用各种服务。它是有效的,但通过这样做,我使控制器依赖于EF,对吗 有什么建议吗?如果您依赖抽象并创建一个IUnitOfWork和IRepository来封装EF上下文,那么控制器将依赖于抽象,而不是任何具体的实现 存储库和工作单元本身是唯一依赖于实体框架或您正在使用的任何ORM的类 public class My

我真的很难找到在MVC应用程序中管理EF上下文的位置

我正在使用Service/Repository/EF方法,并在其中使用UnitOfWork模式和上下文,然后在控制器操作中使用它来利用各种服务。它是有效的,但通过这样做,我使控制器依赖于EF,对吗


有什么建议吗?

如果您依赖抽象并创建一个IUnitOfWork和IRepository来封装EF上下文,那么控制器将依赖于抽象,而不是任何具体的实现

存储库和工作单元本身是唯一依赖于实体框架或您正在使用的任何ORM的类

public class MyController : Controller
{
  public MyController(IRepository r1, IRepository r2, IUnitOfWork uow)
  { ... }

  [HttpPost]
  public ActionResult SomeAction(Model data)
  {
    _r1.DoSomeChangesToEntities(data);
    _r2.DoSomeChangesToEntities(data);
    _uow.SaveChanges();
    return View(...);
  }
}
根据请求编辑:

一个简单的工作实施单元可以是:

public class EFUnitOfWork : IUnitOfWork
{
  private DataContext _context;

  public EFUnitOfWork(DataContext context)
  {
    _context = context;
  }

  public void Commit()
  {
    _context.SubmitChanges();
  } 
}

当然,您可以通过向服务/存储库中注入相同的上下文来确保您的服务/存储库使用与工作单元相同的上下文。

这取决于您所说的“使控制器依赖于EF”是什么意思

在控制器中是否使用任何EF相关类?如果不是,它们显然不依赖于EF,您可以轻松地将存储库和工作单元交换给其他实现(例如使用NHibernate)


但是,是的,如果您在任何层中使用asp.net mvc应用程序,它都依赖于EF。如果不加载EF DLL,它将无法运行。

查看位于@PH的示例代码-您能告诉我IUnitOfWork是什么样子吗?@Sam-添加了Unitofwork示例,虽然这在理论上可以回答这个问题,在这里包括答案的关键部分,并提供链接供参考。那么UnitOfWork应该在哪一层中生存?@Sam:我想你在过去几天里已经问过好几次了,你得到了答案。检查一下。没有理由每天再问一次。