我创建了两个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设置初始化器?
答案 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
静态构造函数用于初始化任何静态数据,或执行仅需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前会自动调用它。
因此静态构造函数非常适合初始化数据库。我已经将这种技术用于多个数据库,它对我来说效果很好。