2012-06-25 21 views
6

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

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

在我的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方法不会被调用。这是因为只能设置一个初始化器?有两种DbContext的初始化方法吗?

回答

8

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

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

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

这是否会有被多次调用的风险?我怀疑初始化是昂贵的,即使没有改变部署。如果你把它放在一个静态构造函数中,意味着它只会被调用一次? – Holf

3

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

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

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

所以静态构造函数非常适合初始化数据库。我已经将这种技术用于多个数据库,并且适用于我。

相关问题