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

在我们的系统中,必须提供一个多租户解决方案,其中每个租户都具有相同的数据结构。

在调查过程中,我遇到了一篇讨论EF4.1的多租户的文章。

http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/

这似乎是一个明智的解决方案,但如果可能的话,我们希望避免使用多个数据库上下文。

此外,对于当前的单租户解决方案,我们需要进行大量迁移。使用EF6,迁移可以针对特定上下文,并且当不支持特定上下文时,将针对默认上下文。

我在这里有几个问题:

使用EF6而不是为EF4指定的方法时,是否有更好的多租户方法? 是否有更好的方法来处理迁移?

非常感谢您的帮助!

2
投票
上下文正在连接到连接字符串,如果在运行时解析了连接字符串,则说明您正在将一个dbcontext类与httprequest特定实例一起使用。为了区分httprequest,可以使用主机名标头。 没有简单的方法来处理迁移。这是一个复杂的问题,但是总之,在版本1结束之前,我通常使用所有脚本来创建初始迁移以配置数据库,这是为了帮助在此更改之后创建的数据库不受任何后续迁移的影响。然后在每次需要更改时添加迁移。让我知道是否需要更多详细信息。
0
投票

我知道这很老,但是仍然是被广泛搜索的主题。

我已成功使用以下方法,通过使用代码优先或使用EDMX的数据库优先的模式,通过模式具有多租户。

DB First(EDMX)-编辑组成EDMX的三个部分; SSDL,CSDL和C-S。 通过不使用任何模式名称来删除对模式的引用。 实施 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来动态构建自己的模型,这与上面的示例类似。例如,通过调用获取连接架构并返回连接架构的方法来建立连接。 请参阅Multi-Tenant With Code First EF6中的答案