2011-08-09 33 views
1

我目前正在執行以下操作來刪除任何我不想包含的EF類。但這意味着我必須列出所有的類。使用代碼優先和實體框架時,「更好」的方法忽略類

protected override void OnModelCreating(DbModelBuilder AModelBuilder) 
{ 
    // Remove any classes that we don't want in the database. These are our derived classes 
    AModelBuilder.Ignore<TCompetition>(); 
    AModelBuilder.Ignore<TCompeitionLadder>(); 
    AModelBuilder.Ignore<TCompeitionPersonRole>(); 
    AModelBuilder.Ignore<TCountry>(); 
    AModelBuilder.Ignore<TSport>(); 
    AModelBuilder.Ignore<TVenue>(); 
} 

所以不是我想我會用反射來獲取的裝配類型列表中,然後刪除,我不希望包含任何類引用。但我似乎無法得到這個工作,因爲類型對象不是Ignore()所需的期望的類引用類型。任何人都可以指出我正確的方向嗎?

protected override void OnModelCreating(DbModelBuilder AModelBuilder) 
{ 
    // Remove any classes that we don't want in the database. These are our derived classes 
    Assembly objAssembly = Assembly.GetExecutingAssembly(); 
    foreach (Type objType in objAssembly.GetTypes()) 
    { 
     if (objType.BaseType.FullName.StartsWith("TEntityFramework", true, null)) 
     { 
      AModelBuilder.Ignore<objType>(); 
     } 
    } 
} 

回答

1

使用反射來調用泛型函數,

而不是寫這個的:

AModelBuilder.Ignore<objType>(); 

這樣寫:

MethodInfo method = typeof(DbModelBuilder).GetMethod("Ignore"); 
MethodInfo generic = method.MakeGenericMethod(objType); 
generic.Invoke(AModelBuilder, null); 
+0

我得到的錯誤: 類型或名稱空間名稱'AModelBuilder'找不到(您是否缺少使用指令或一個程序集參考?)\t for: MethodInfo method = typeof(AModelBuilder).GetMethod(「Ignore」); – TheEdge

+0

我的錯誤。我誤解了你的類型,我編輯了代碼,測試了新的代碼 –