Dot-Net

EF 4.1,程式碼優先:有沒有一種簡單的方法可以刪除所有約定?

  • March 20, 2011

我們可以通過這種方式刪除單個約定:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<ConcurrencyCheckAttributeConvention>();
// and 31 conventions more

但我想念類似的東西modelBuilder.Conventions.RemoveAll()。有沒有一種簡單的方法可以刪除所有這些?

(我什至不確定我是否真的想最終刪除所有約定。但是隨著我不斷增長的對像模型,我很難清楚地區分映射到數據庫的哪些部分來自約定,以及我確實在 Fluent 中明確配置了哪些部分API。我認為目前我混合了基於純約定的映射、明確覆蓋的約定和明確複製的約定。至少出於學習目的和對映射的清晰理解,能夠關閉所有約定會很好。)

我只是用反射創建了一些解決方案:

public class Context : DbContext
{
   private static IList<Type> _types = typeof(IConvention).Assembly.GetTypes()
       .Where(t => !t.IsAbstract && t.IsClass && 
                   typeof(IConvention).IsAssignableFrom(t))
       .ToList();

   private static MethodInfo _method = 
       typeof(ConventionsConfiguration).GetMethod("Remove");

   // DbSets ...

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
       base.OnModelCreating(modelBuilder);

       foreach (var type in _types)
       {
           MethodInfo method = _method.MakeGenericMethod(type);
           method.Invoke(modelBuilder.Conventions, null);
       }
   }
}

引用自:https://stackoverflow.com/questions/5370518