Asp.net mvc EntityFramework 4.1代码优先-在存储库之间共享dbContext的正确方法?

Asp.net mvc EntityFramework 4.1代码优先-在存储库之间共享dbContext的正确方法?,asp.net-mvc,entity-framework,ninject,entity-framework-4.1,ef-code-first,Asp.net Mvc,Entity Framework,Ninject,Entity Framework 4.1,Ef Code First,我遇到了多个上下文的问题,出现的主要解决方案是在存储库之间共享上下文,但是我还没有找到一个好的例子来说明如何做到这一点 作为参考,我正在使用MVC Web应用程序连接到我的数据层。我希望每个用户请求有一个上下文(假设这是正确的) 谢谢 编辑- 这是我的解决方案,借助BrokenGlass的链接和以下内容: 我基本上实现了工作单元模式和依赖注入。除了使用MVC,我还应该提到Ninject 在给定的存储库构造函数中(有关工作单元模式的详细信息,请参见下面的链接): 在NinjectMVC3类中的我的

我遇到了多个上下文的问题,出现的主要解决方案是在存储库之间共享上下文,但是我还没有找到一个好的例子来说明如何做到这一点

作为参考,我正在使用MVC Web应用程序连接到我的数据层。我希望每个用户请求有一个上下文(假设这是正确的)

谢谢

编辑-

这是我的解决方案,借助BrokenGlass的链接和以下内容:

我基本上实现了工作单元模式和依赖注入。除了使用MVC,我还应该提到Ninject

在给定的存储库构造函数中(有关工作单元模式的详细信息,请参见下面的链接):

在NinjectMVC3类中的我的MVC应用程序中(键是InRequestScope()方法):

私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To().InRequestScope();
kernel.Bind().To();
//...
}  

您的存储库层应提供表示单个请求的上下文对象,并使用上下文对象,然后在满足请求所需的所有单个存储库上使用上下文对象

特别是对于HTTP/web应用程序,您可以缓存数据库上下文,其中存储每个HTTP请求的共享数据。还可以查看此类似的SO线程以了解详细信息:

我的答案提供了一个
存储提供程序的实现,该实现可用于
对象上下文的单个实例。您可以以同样的方式使用代码,使用LINQ to SQL
DataContext
而不是EF
ObjectContext
RepositoryProvider
优于Ninject的好处是
RepositoryProvider
实现不绑定到特定的DI框架,并且可以在任何DI框架中配置它自己


此外,您还可以通过使用
DataContextFactory
类来管理
DataContext
到线程或WebRequest的创建和作用域(例如@BrokenGlass的答案中的
HttpContext.Current.Items
),感谢工作单元链接,我没有在我的存储库中实现任何类型的DI,基本上这就是我需要做的。我还使用了Ninject,因此它使答案有点复杂,但最终使解决方案更容易。我将用我的最终解决方案更新我的问题。
public class PersonRepository : IPersonRepository
{
    private readonly MyContext _context;

    public PersonRepository(IUnitOfWork unitOfWork) 
    {
        if (unitOfWork == null)
            throw new ArgumentNullException("unitOfWork");

        _context = unitOfWork as MyContext;
    } 

    //...
}
private static void RegisterServices(IKernel kernel)
{
     kernel.Bind<IUnitOfWork>().To<MyContext>().InRequestScope();
     kernel.Bind<IPersonRepository>().To<PersonRepository>();
     //...
}