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

时间:2014-08-04 12:19:46

标签: c# .net sql-server entity-framework entity-framework-6

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

在调查期间,我发现了一篇与EF4.1讨论多租户的文章。

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

这看起来是一个明智的解决方案,但如果可能的话,我们宁愿避免使用多个数据库上下文。

此外,我们针对当前的单租户解决方案进行了大量迁移。使用EF6,迁移可以定位到特定上下文,如果不支持,则会定位默认值。

我在这里有几个问题:

  1. 当使用EF6以外的EF6时,是否有更好的多租户方法?
  2. 有更好的方法来处理迁移吗?
  3. 非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

我成功地使用了以下方法,通过使用Code-First或使用EDMX的DB First来按架构实现多租户。

  1. DB First(EDMX)-编辑组成EDMX的三个部分; SSDL,CSDL和C-S。
    • 通过不使用任何内容替换模式名称来删除对模式的所有引用。
  2. 实施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
  1. 使用IDbModelCacheKeyProvider动态地构建自己的模型,该方法的使用方法与上面的示例类似。例如,通过调用获取连接架构并返回连接架构的方法来建立连接。