2012-05-02 88 views
3

我正在使用EF 4.3.1,並且我有100多個驅動1個基本上下文的上下文。對於所有上下文我想禁用數據庫初始化。爲實體框架禁用數據庫初始化4.3

是否可以爲實體框架設置默認行爲?

在此先感謝

+0

只是想點你應該重新提出你的問題,提到你需要這種行爲來處理多種情況。所有提供的答案都適用於任何給定的上下文。另外,你不應該在問題標題中使用標籤,因爲它是多餘的。我決定不編輯它,因爲我覺得你應該在同一時間重新修改它。 – julealgon

+0

這個問題很古老,但我不得不問,爲什麼你只是在代碼中註釋掉初始化行呢? – rism

回答

0
//Gather all the DbContexts types in the assembly 
var allDbContextsTypes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.BaseType == (typeof(DbContext))).ToList(); 

foreach (Type dbContextType in allDbContextsTypes) 
{ 
    //Get the SetInitializerMethod 
    MethodInfo initializerMethod = typeof(Database).GetMethod("SetInitializer"); 

    //Make it generic! (Oh yeah) 
    MethodInfo dbContextInitializerMethod = initializerMethod.MakeGenericMethod(dbContextType); 

    //Invoke the method with null initializer 
    dbContextInitializerMethod.Invoke(null, new object[]{null}); 
} 

在最後給出,它給像:Database.SetInitializer<YourDbContext>(null); 其中YourDbContext是在循環當前的DbContext類型

2

Database.SetInitializer<TContext>是你所追求的。將null傳遞給此方法應禁用初始化。

http://msdn.microsoft.com/en-us/library/gg679461(v=vs.103).aspx

+0

這不是我想要的,因爲我不想編輯100多個實體。當我爲基本上下文運行此代碼時,它不會更改任何內容並創建數據庫。 –

+0

如果你在所有派生的上下文中都有DbInitializer代碼,那麼,不,這不會工作,因爲派生的構造函數在基礎構造函數之後運行,所以它只會關閉它,然後再次啓動。 – rism

1

你可以改變你的* 的.config文件來禁用數據庫初始化。這是根據上下文完成的,但也許它適用於您的基本上下文。

<contexts> 
    <context type=" Blogging.BlogContext, MyAssembly" disableDatabaseInitialization="true" /> 
</contexts> 

一個更好的解釋是EF 4.3 Configuration File Settings

+0

不錯的想法,但它不適用於基礎上下文。 –

+0

由於代碼覆蓋配置,因此這不起作用。 – rism