将多个数据库与一个DBContext



我正在编写一个SaaS应用程序,其数据层将在SQL Server上运行并由一个通用数据库组成,以及一个为服务订阅的公司的组织类型数据库。

通用数据库将包含用户列表,用户对ORG映射,管理信息等。组织类型的数据库将包含特定于公司的数据(例如:发票和订单,如果是这样的程序)。

我的目标是使用 DbContext,包含对公共和组织模式中表中表的引用,并让EF在运行时知道要使用的org db之一。<<<<<<<<<<<<<<<<<<<<<</p>

这是可以使用EF6的,开箱即用的(没有hacks)?

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

我们当前在数据库之间切换,我们已经编辑了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字符串更改为正确的连接字符串,即通用或组织。MyContext更改后,创建上下文,它将指向正确的数据库。

我的建议是使用包含所有表的单个dataContext,然后实现一个数据访问层,该数据访问层限制了基于登录的用户登录的公司表的访问。我相信尝试在DataContext层进行此操作可能会引起一些头痛。

我也有类似的问题,我实施了标准的IREPOSITOR/IUNITOFWORK设计模式。然后,我实施了一个"过滤式验证者",负责在各个组织之间执行访问限制。

最新更新