我们有一个实现DbContext的产品类。 OnModelCreating方法的代码如下:
modelBuilder.Configurations.Add(new CustomProductMap());
modelBuilder.Configurations.Add(new CustomProductDetailMap());
modelBuilder.Configurations.Add(new CustProdCatMappingMap());
modelBuilder.Configurations.Add(new CustProductSKUMap());
...
这里实体是逐个添加的。
我确信使用反射或使用IoC容器有更好的方法。
有人可以给我一个例子,以便我自己实现吗?
答案 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
方法的适当重载。