2010-12-08 57 views
5

我不想將每個映射類手動添加到ModelBuilder(),所以試圖使用我有限的反射知識來註冊它們。這就是我,這就是我得到的錯誤:爲構建實體框架EntityTypeConfiguration列表的反射CPT5

CODE:

private static ModelBuilder CreateBuilder() { 
      var contextBuilder = new ModelBuilder(); 
      IEnumerable<Type> configurationTypes = typeof(DatabaseFactory) 
       .Assembly 
       .GetTypes() 
       .Where(type => type.IsPublic && type.IsClass && !type.IsAbstract && !type.IsGenericType && typeof(EntityTypeConfiguration).IsAssignableFrom(type) && (type.GetConstructor(Type.EmptyTypes) != null)); 

      foreach (var configuration in configurationTypes.Select(type => (EntityTypeConfiguration)Activator.CreateInstance(type))) 
      { 
       contextBuilder.Configurations.Add(configuration); 
      } 

      return contextBuilder; 
     } 

錯誤: 錯誤2個類型參數的方法「System.Data.Entity.ModelConfiguration .Configuration.ConfigurationRegistrar.Add(System.Data.Entity.ModelConfiguration.EntityTypeConfiguration)'不能從使用情況中推斷出來。嘗試明確指定類型參數。 C:\ ROOT \研發\操場\ PostHopeProject \ PostHope.Infrastructure.DataAccess \ DatabaseFactory.cs 67個17個PostHope.Infrastructure.DataAccess

回答

11

原來的答覆:

http://areaofinterest.wordpress.com/2010/12/08/dynamically-load-entity-configurations-in-ef-codefirst-ctp5/

隱含的解決方案的詳細信息:

以上引用的文章顯示,你可以使用dynamic關鍵字繞過編譯時的類型檢查和從而解決了嘗試將配置添加到DbModelBuilder的通用Add()方法的限制。下面是一個簡單示例:

// Load all EntityTypeConfiguration<T> from current assembly and add to configurations 
var mapTypes = from t in typeof(LngDbContext).Assembly.GetTypes() 
       where t.BaseType != null && t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>) 
       select t; 

foreach (var mapType in mapTypes) 
{ 
    // note: "dynamic" is a nifty piece of work which bypasses compile time type checking... (urgh??) 
    //  Check out: http://msdn.microsoft.com/en-us/library/vstudio/dd264741%28v=vs.100%29.aspx 
    dynamic mapInstance = Activator.CreateInstance(mapType); 
    modelBuilder.Configurations.Add(mapInstance); 
} 

你可以閱讀更多關於使用此關鍵字on MSDN

1

var configurationType類型,這是EntityTypeConfiguration類型的不是。您必須提供Add方法EntityTypeConfiguration的一個實例,推測可能基於您當前的類型:configuration