如何在Code First中的多个上下文(相同的基础)之间动态切换

时间:2012-01-02 19:15:55

标签: entity-framework ef-code-first dbcontext

我正在研究一个核心项目中包含DbContext(名为CoreContext)的解决方案。此上下文包含一个实体(Product)和其他几个实体,它引用了一个抽象类(ProductConstraints),它为一般产品提供了通用的验证规则。永远不会直接使用此上下文。在同一解决方案中还有三个其他项目(Product1,Product2和Product3),它们继承CoreContext(作为ProductXContext)和ProductConstraints(作为ProductXConstraints)类,为其特定产品实现自定义验证规则。 / p>

还有另一个包含自定义CodeFirstMembership的项目。它的“用户”实体包含一个“产品”属性,用于定义用户将使用的产品。

最后,我有一个MVC3项目,我希望根据当前用户的“产品”信息实例化适当的上下文。创建类似ContextFactory的内容,以接收此产品并返回正确的DbContext。我尝试了一些方法但没有取得重大成功。

1 个答案:

答案 0 :(得分:3)

您可以使用依赖注入来解决您的问题。如果用户只绑定了一个产品,您可以将该详细信息存储在Session中,以避免往返数据库。

public class ContextFactory
{    
     public CoreContext CreateContext()
     {
         var product = HttpContext.Current.Session["Product"] as string;

         //resolve the correct context

         return context;
     }
}

然后您可以使用DI容器注册工厂。

builder.Register(c => ContextFactory.CreateContext()).As<CoreContext>();

然后您可以在控制器中使用构造函数注入

public class MyController : Controller
{
     public MyController(CoreContext context)
     {

     }    
}