【问题标题】:Multi-tenancy in EF6 with multiple schemas having the same tablesEF6 中的多租户,具有具有相同表的多个模式
【发布时间】:2014-08-04 12:19:45
【问题描述】:

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

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

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

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

此外,我们目前的单租户解决方案有大量迁移。使用 EF6,可以针对特定上下文进行迁移,如果不支持任何上下文,则以默认为目标。

我有几个问题:

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

非常感谢任何帮助!

【问题讨论】:

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


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

【讨论】:

  • @anlBMer 感谢您的回答,但您能否详细说明一下,如果多租户应用程序存在,我们会面临哪些问题?我们正在使用 azure 来托管和 EF6,是否会出现任何连接池问题?你的意见是什么?
  • 抱歉,我没有足够的时间来绘制更多插图。 1) 有一个重要的缺点,就是您不能立即进行缓存。要使缓存具有多租户功能,开发将花费更多时间。 2)也许题外话,如果它托管在云中,取决于它的托管方式,如果它是一个网络应用程序,那么你将需要使用云缓存服务。
【解决方案2】:

我知道这是旧的,但它仍然是广泛搜索的主题。

我已经成功地使用了以下方法,通过模式拥有多租户,使用 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 动态构建您自己的模型,其使用方法与上例类似。例如通过调用获取连接模式并返回它的方法来构建连接。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 2013-03-24
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多