Entity framework 如何首先在代码中动态切换多个上下文(相同的基础)

Entity framework 如何首先在代码中动态切换多个上下文(相同的基础),entity-framework,ef-code-first,dbcontext,Entity Framework,Ef Code First,Dbcontext,我正在开发一个解决方案,它有一个核心项目,其中包含一个DbContext(名为CoreContext)。此上下文包含一个实体(产品)以及其他几个实体,该实体引用一个抽象类(ProductConstraints),该抽象类为一般产品提供通用验证规则。此上下文从未直接使用。同一解决方案中还有三个其他项目(Product1、Product2和Product3),它们同时继承了CoreContext(作为ProductXContext)和ProductConstraints(作为ProductXCons

我正在开发一个解决方案,它有一个核心项目,其中包含一个
DbContext
(名为
CoreContext
)。此上下文包含一个实体(产品)以及其他几个实体,该实体引用一个抽象类(ProductConstraints),该抽象类为一般产品提供通用验证规则。此上下文从未直接使用。同一解决方案中还有三个其他项目(Product1、Product2和Product3),它们同时继承了
CoreContext
(作为ProductXContext)和
ProductConstraints
(作为ProductXConstraints)类,为特定产品实现自定义验证规则

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


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

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

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>();

你尝试了哪些方法?什么失败了?我尝试过使用反射,但最后出现了一些依赖性问题。用户可以使用许多产品,但一次只能使用一个,因此会话变量方法可以工作。我知道DI的概念,但以前从未使用过DI容器。我将尝试一下MSUnity。最后回到项目中,成功地使用容器创建了一个工厂。现在一切正常。但我的MVC项目仍然引用了我的三个产品上下文。。。我将尝试删除这些引用,并实际使用Unity注入它们。我把你的回答记为回答,谢谢!
public class MyController : Controller
{
     public MyController(CoreContext context)
     {

     }    
}