有没有更好的方法在EF中实现OnModelCreating方法?

时间:2013-08-13 08:08:38

标签: c# entity-framework

我们有一个实现DbContext的产品类。 OnModelCreating方法的代码如下:

 modelBuilder.Configurations.Add(new CustomProductMap());
 modelBuilder.Configurations.Add(new CustomProductDetailMap());
 modelBuilder.Configurations.Add(new CustProdCatMappingMap());
 modelBuilder.Configurations.Add(new CustProductSKUMap());

...

这里实体是逐个添加的。

我确信使用反射或使用IoC容器有更好的方法。

有人可以给我一个例子,以便我自己实现吗?

1 个答案:

答案 0 :(得分:0)

您可以使用以下查询来获取从EntityTypeConfiguration或ComplexTypeConfiguration继承的类型的实例:

var maps = from a in AppDomain.CurrentDomain.GetAssemblies()
           where a.GetName().Name != "EntityFramework" // skip EF assembly
           from t in a.GetTypes()                        
           where t.BaseType != null && t.BaseType.IsGenericType
           let baseDef = t.BaseType.GetGenericTypeDefinition()
           where baseDef == typeof(EntityTypeConfiguration<>) ||
                 baseDef == typeof(ComplexTypeConfiguration<>)
           select Activator.CreateInstance(t);

之后您需要做的就是将地图添加到modelBuilder配置中:

foreach (var map in maps)
    modelBuilder.Configurations.Add((dynamic)map);

请注意,我使用dynamic关键字,因为激活器返回类型为object的实例。因此,我们需要根据实际的地图类型调用Add方法的适当重载。