在我们的系统中,需要提供多租户解决方案,其中每个租户具有相同的数据结构。
在调查期间,我发现了一篇与EF4.1讨论多租户的文章。
http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/
这看起来是一个明智的解决方案,但如果可能的话,我们宁愿避免使用多个数据库上下文。
此外,我们针对当前的单租户解决方案进行了大量迁移。使用EF6,迁移可以定位到特定上下文,如果不支持,则会定位默认值。
我在这里有几个问题:
非常感谢任何帮助!
答案 0 :(得分:2)
答案 1 :(得分:0)
我知道这很老,但是仍然是被广泛搜索的话题。
我成功地使用了以下方法,通过使用Code-First或使用EDMX的DB First来按架构实现多租户。
IDbCommandInterceptor
,并在所有 * Executing 实现中加入command.CommandText = command.CommandText.Replace("<unwanted-schema-here>", "<your-actual-schema>")
。然后在初始化新上下文之前删除并添加拦截器。 示例:
将工厂方法放在DbContext
的Partial类中。
Private Shared _lschema As String
Public ReadOnly Property schema As String = _lschema
Public Shared Function GetContext(Optional connString As String = Nothing) As MyContext
If connString IsNot Nothing Then
Dim conn As EntityConnection = ContextHelper.CreateConnection(Of MyContext)(connString,ByRef _lschema)
DbInterception.Remove(New SchemaInterceptor)
DbInterception.Add(New SchemaInterceptor(_lschema))
Dim ctx = New MyContext(conn, False)
ctx.Configuration.LazyLoadingEnabled = False
ctx.Configuration.AutoDetectChangesEnabled = True
Return ctx
End If
Return New MyContext()
End Function
IDbModelCacheKeyProvider
动态地构建自己的模型,该方法的使用方法与上面的示例类似。例如,通过调用获取连接架构并返回连接架构的方法来建立连接。