【问题标题】:Multiple DbContext, multiple Database.SetInitializer多个 DbContext,多个 Database.SetInitializer
【发布时间】:2015-07-16 08:20:05
【问题描述】:

我创建了两个 DbContext,一个用于应用程序配置,第二个用于日志记录。

原因是,我想在日志记录数据库上设置一个最大大小,这样它就不会耗尽所有可用磁盘空间并阻止其他数据库工作。

在我的 global.asax.cs 文件中,我有以下内容:

        protected void Application_Start()
    {

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        Database.SetInitializer<AdminContext>(new AdminInitialiser());
        Database.SetInitializer<LoggingContext>(new LoggingInitialiser());
    }

没有调用 LoggingInitialiser 中的 InitializeDatabase 方法。这是因为只能设置一个初始化程序吗?有没有办法为两个 DbContexts 设置初始化程序?

【问题讨论】:

    标签: asp.net-mvc entity-framework-4


    【解决方案1】:

    改为在 DbContext 构造函数中设置初始化程序。

    public class AdminContext : DbContext
    {
        public AdminContext()
        {
            Database.SetInitializer(new AdminInitialiser());
        }
    }
    
    public class LoggingContext : DbContext
    {
        public LoggingContext()
        {
            Database.SetInitializer(new LoggingInitialiser());
        }
    }
    

    【讨论】:

    • 这不会有被多次调用的风险吗?我怀疑初始化很昂贵,即使部署没有更改。如果你把它放在一个静态构造函数中,这意味着它只会被调用一次呢?
    【解决方案2】:

    是的,你可以做到。您只需要在继续下一个之前进行初始化。

      Database.SetInitializer<MyDBContext>(myInitializer);
      MyDbContext context = new MyDbContext();
      context.Database.Initialize(false);
    
      Database.SetInitializer<MySecondDBContext>(myInitializer);
      MySecondDbContext context2 = new MySecondDbContext();
      context2.Database.Initialize(false);
    

    注意:我通常从依赖解析器获取 DbContext 实例...

    【讨论】:

      【解决方案3】:

      我建议将 SetInitializer 调用放在静态构造函数中,如下所示:

          static ApplicationIdentityDbContext()
          {
              Database.SetInitializer(new IdentityDbInitializer());
          }
      

      以下来自MSDN

      静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前自动调用它。

      所以静态构造函数是初始化数据库的理想选择。我已经将这种技术用于多个数据库,它对我来说效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        相关资源
        最近更新 更多