0

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

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

...

在这里,实体被一一添加。

我确信使用反射或使用 IoC 容器有更好的方法来做到这一点。

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

4

1 回答 1

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);

之后您需要做的就是将地图添加到模型构建器配置中:

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

请记住,我使用dynamic关键字是因为 activator 返回带有 type 的实例object。所以我们需要Add根据实际地图类型调用适当的方法重载。

于 2013-08-13T09:04:44.173 回答