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,迁移可以针对特定的上下文,当不支持时,将以默认值为目标。

我有几个问题:

  1. 在使用EF6时,除了为EF4指定的方法之外,是否有更好的多租户方法?
  2. 是否有更好的方法来处理迁移?

任何帮助都非常感谢!

EF6中的多租户,具有相同表的多个模式

  1. 上下文正在连接到一个连接字符串,如果连接字符串在运行时被解析,那么你正在使用一个dbcontext类与httprequest特定实例。为了区分httprequest,可以使用主机名头。
  2. 没有简单的方法来处理迁移。这是一个复杂的问题,但简而言之,在版本1结束之前,我通常使用所有脚本创建一个初始迁移来供应数据库,这是为了帮助在此更改之后创建的数据库不受任何迁移的影响。然后在每次需要更改时添加迁移。如果需要更多细节,请告诉我。

我知道这是一个古老的话题,但它仍然是广泛搜索的话题。

我已经成功地使用了以下方法通过模式拥有多租户,使用Code-First或DB First使用EDMX。

  1. DB First (EDMX) -编辑组成EDMX的三个部分;SSDL、CSDL和C-S。
    • 通过不替换模式名来删除对模式的任何引用。
  2. 在所有*正在执行的实现下实现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的答案