实体框架4.1代码优先 - 在存储库之间共享dbContext的正确方法?

时间:2011-06-19 17:03:46

标签: asp.net-mvc entity-framework ninject entity-framework-4.1 ef-code-first

我遇到了多个上下文的问题,并且出现的主要解决方案是在存储库之间共享上下文但是我没有找到关于如何执行此操作的良好示例。

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

谢谢,

编辑 -

这是我在BrokenGlass的链接和以下SO Question的帮助下的解决方案:

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

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

public class PersonRepository : IPersonRepository
{
    private readonly MyContext _context;

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

        _context = unitOfWork as MyContext;
    } 

    //...
}

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

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

2 个答案:

答案 0 :(得分:4)

您的存储库层应提供代表单个请求的unit of work,并使用上下文对象,然后在完成请求所需的所有单个存储库上使用该对象。

对于HTTP / Web应用程序,您可以在HttpContext.Current.Items中缓存db上下文,该上下文存储每个HTTP请求的共享数据。有关详细信息,请查看此类似的SO主题:attaching linq to sql datacontext to httpcontext in business layer

答案 1 :(得分:0)

我对C#/EF and the Repository Pattern: Where to put the ObjectContext in a solution with multiple repositories?的回答提供了RepositoryProvider的实现,该实现适用于ObjectContext的单个实例。您可以使用相同的方式使用代码,使用LINQ-to-SQL DataContext而不是EF ObjectContextRepositoryProvider优于Ninject的好处是RepositoryProvider实现不绑定到特定的DI框架,并且本身可以在任何DI框架中配置。

此外,您可以使用DataContext类来管理HttpContext.Current.Items到线程或WebRequest的创建和范围设置(例如@ BrokenGlass对DataContextFactory的回答)的 here