8

我创建了两个 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 设置初始化程序?

4

3 回答 3

8

而是在 DbContext 构造函数中设置初始化程序。

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

public class LoggingContext : DbContext
{
    public LoggingContext()
    {
        Database.SetInitializer(new LoggingInitialiser());
    }
}
于 2012-06-25T14:21:32.650 回答
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 实例......

于 2012-06-29T10:04:13.400 回答
3

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

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

以下来自 MSDN

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

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

于 2015-07-16T00:20:05.210 回答