2012-06-25 41 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只能執行一次。它在創建第一個實例或引用任何靜態成員之前自動調用。

所以靜態構造函數非常適合初始化數據庫。我已經將這種技術用於多個數據庫,並且適用於我。

相關問題