EF6中的多租户,具有相同表的多个模式
本文关键字:模式 EF6 | 更新日期: 2023-09-27 18:16:40
在我们的系统中,需要提供多租户解决方案,其中每个租户具有相同的数据结构。
在调查过程中,我看到一篇讨论EF4.1多租户的文章。
http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/这看起来是一个明智的解决方案,但如果可能的话,我们更希望避免多个数据库上下文。
此外,我们有大量针对当前单租户解决方案的迁移。使用EF6,迁移可以针对特定的上下文,当不支持时,将以默认值为目标。
我有几个问题:
- 在使用EF6时,除了为EF4指定的方法之外,是否有更好的多租户方法?
- 是否有更好的方法来处理迁移?
任何帮助都非常感谢!
- 上下文正在连接到一个连接字符串,如果连接字符串在运行时被解析,那么你正在使用一个dbcontext类与httprequest特定实例。为了区分httprequest,可以使用主机名头。 没有简单的方法来处理迁移。这是一个复杂的问题,但简而言之,在版本1结束之前,我通常使用所有脚本创建一个初始迁移来供应数据库,这是为了帮助在此更改之后创建的数据库不受任何迁移的影响。然后在每次需要更改时添加迁移。如果需要更多细节,请告诉我。
我知道这是一个古老的话题,但它仍然是广泛搜索的话题。
我已经成功地使用了以下方法通过模式拥有多租户,使用Code-First或DB First使用EDMX。
- DB First (EDMX) -编辑组成EDMX的三个部分;SSDL、CSDL和C-S。
- 通过不替换模式名来删除对模式的任何引用。
- 在所有*正在执行的实现下实现
IDbCommandInterceptor
并包括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
动态构建自己的模型,这在与上面示例类似的方法中使用。例如,通过调用获取连接模式并返回它的方法来构建连接。- 查看代码优先的多租户EF6的答案