将多个数据库与一个DbContext一起使用

时间:2014-01-23 00:04:26

标签: c# entity-framework dbcontext

我正在编写一个SaaS应用程序,其数据层将在SQL Server上运行,并由一个Common数据库和一个组织类型数据库组成,每个公司都订阅该服务。

Common数据库将包含用户列表,用户到组织映射,管理员信息等。组织类型数据库将包含公司特定的数据(例如:发票和订单,如果是那种程序)。

我的目标是使用单个 DbContext,其中包含对Common和Organization模式中的表的引用,并让EF在运行时知道哪个Org DB的使用。

EF6是否可以开箱即用(没有黑客攻击)?

2 个答案:

答案 0 :(得分:0)

我认为在一个上下文中这是不可能的,或者在上下文之间切换至少是一个真正的痛苦。听起来Common数据库仅用于设置并可能确定要使用的特定于组织的数据库。有两个背景真的不是什么大事。

我们目前在数据库之间切换,我们编辑了Model.Context.tt文件(生成实际的类),使DbContext构造函数从设置中获取连接字符串;

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
    public <#=code.Escape(container)#>()
        : base(Properties.Settings.Default.MyContext)
{
<#

MyContext只是连接字符串,就像这样;

"Metadata=res://*/MantraModel.csdl|res://*/MantraModel.ssdl|res://*/MantraModel.msl;provider=System.Data.SqlClient;" +
                "provider connection string=\"Data Source={0};Initial Catalog={1};Integrated Security=True;Connection Timeout={2};Persist Security Info=False;MultipleActiveResultSets=True;App=EntityFramework\""

然后,在代码中,当您想要更改数据库时,只需将Properties.Settings.Default.MyContext字符串更改为正确的连接字符串,即Common或Organization。更改MyContext后,创建上下文,它将指向正确的数据库。

答案 1 :(得分:0)

我的建议是使用包含所有表的单个DataContext,然后实现一个数据访问层,该数据访问层根据登录用户限制对公司表的访问。我相信在DataContext层尝试这样做可能会引起一些麻烦。

我遇到了类似的问题,我实现了标准的IRepository / IUnitOfWork设计模式。然后我实现了一个“FilteredRepository”,它负责在各个​​组织之间实施访问限制。