多个DbContext,多个Database.SetInitializer

时间:2012-06-25 13:29:45

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

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

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

在我的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设置初始化器?

3 个答案:

答案 0 :(得分:8)

改为在DbContext构造函数中设置初始值设定项。

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

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

答案 1 :(得分:4)

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

  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实例...

答案 2 :(得分:3)

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

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

以下是来自MSDN

  

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

因此静态构造函数非常适合初始化数据库。我已经将这种技术用于多个数据库,它对我来说效果很好。

相关问题