【问题标题】:Do I need a DbContext for each database?每个数据库都需要一个 DbContext 吗?
【发布时间】:2013-08-05 03:17:16
【问题描述】:

一些背景知识:我们销售在线产品,每个客户都有自己的数据库,但使用的是共享服务。

我想使用 EF6 而不是旧的 ADO.NET,但据我所知,在创建 dbcontext 时无法更改数据库,而且我担心为每个查询创建一个新的 dbcontext 成本太高.

缓存 1000+ dbcontext 听起来是一个非常糟糕的解决方案。

【问题讨论】:

    标签: entity-framework dbcontext


    【解决方案1】:

    连接池不适用于 1000 多个连接字符串。每个数据库将有一个池,从而导致大量连接。

    我建议您先连接到一个虚拟数据库,然后使用DbConnection.ChangeDatabase 更改为正确的数据库。 EF 没有注意到这一点并且工作正常。

    您不需要缓存DbContext。它们很轻。

    【讨论】:

      【解决方案2】:

      这其实很容易做到

      public class MyContext : DbContext{
          public MyContext(string connectionStringName): base(connectionStringName){}
      }
      

      public class MyContext : DbContext{
          public MyContext(DbConnection connection): base(connection, contextOwnsConnection: true){}
      }
      

      【讨论】:

      • +1 我使用 Luke 建议的多租户模型方法
      • 关于连接池的说明,如果设置第二个构造函数并使用 contextownsconnection false ,则可以重用连接。你可能也需要火星来做到这一点
      【解决方案3】:

      您不必太在意构建 DbContext 的成本。在决定 DbContext/ObjectContext 的生命周期时还需要考虑其他因素,您可以找到 here

      共享您的 DbContext 实例并不是一个好主意,主要是因为上面链接中提到的内存使用和线程安全。

      【讨论】:

        【解决方案4】:

        接下来你可以做:

        public class BaseContext<TContext> : DbContext where TContext : DbContext
        {
             protected BaseContext(): base("name=DbName")
             {
             }
        }
        

        然后像这样使用它:

            public class StatusContext : BaseContext<StatusContext>
            {
                 ....
            }
        

        从 BaseContext 继承的所有上下文都将使用相同的 db。

        【讨论】:

        • 所以如果我有 100 个相同的数据库,我不会为每个 http 请求使用新的连接字符串而遇到麻烦?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 2019-11-13
        • 2017-07-05
        • 1970-01-01
        • 2022-01-08
        相关资源
        最近更新 更多