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)
{
}
}