我正在编写一个SaaS应用程序,其数据层将在SQL Server上运行,并由一个Common数据库和一个组织类型数据库组成,每个公司都订阅该服务。
Common数据库将包含用户列表,用户到组织映射,管理员信息等。组织类型数据库将包含公司特定的数据(例如:发票和订单,如果是那种程序)。
我的目标是使用单个 DbContext
,其中包含对Common和Organization模式中的表的引用,并让EF在运行时知道哪个Org DB的使用。
EF6是否可以开箱即用(没有黑客攻击)?
答案 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”,它负责在各个组织之间实施访问限制。