如何获取Entity Framework所有EntityTypeConfiguration引用并提取配置属性至字典
获取所有EntityTypeConfiguration并提取属性到字典
嘿,我来帮你搞定这个EF6的问题!既然你的数据库读写已经正常,那接下来要获取配置引用和提取属性其实不难,我分步骤给你讲:
第一步:拿到所有EntityTypeConfiguration实例
EF6里,DbContext的ModelBuilder维护着所有注册的实体配置。不过ModelBuilder是受保护的,所以你得在自己的DbContext里加个方法把它暴露出来,或者直接在OnModelCreating里处理。
比如先改造你的DbContext:
public class MyDbContext : DbContext { public DbSet<A> As { get; set; } public DbSet<B> Bs { get; set; } // 新增方法:获取所有已注册的配置 public IEnumerable<EntityTypeConfiguration> GetAllEntityConfigs() { return ModelBuilder.Configurations.Cast<EntityTypeConfiguration>(); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 这里是你已经写好的配置注册 modelBuilder.Configurations.Add(new AConfiguration()); modelBuilder.Configurations.Add(new BConfiguration()); } }
这样你就能通过GetAllEntityConfigs()方法拿到所有EntityTypeConfiguration的引用了。
第二步:把配置里的属性提取到字典
EF6的EntityTypeConfiguration没有公开直接获取属性映射的API,所以我们得用反射来访问它的内部PropertyMappings集合(这个内部实现在EF6里是稳定的,放心用)。
写个方法来做这件事:
using System.Collections.Generic; using System.Data.Entity.ModelConfiguration; using System.Reflection; public Dictionary<string, List<string>> ExtractEntityProperties(MyDbContext context) { var entityPropsDict = new Dictionary<string, List<string>>(); foreach (var config in context.GetAllEntityConfigs()) { var entityName = config.EntityType.Name; var propNames = new List<string>(); // 反射获取内部的PropertyMappings集合 var propertyMappings = config.GetType() .GetProperty("PropertyMappings", BindingFlags.Instance | BindingFlags.NonPublic) ?.GetValue(config) as IEnumerable<object>; if (propertyMappings != null) { foreach (var mapping in propertyMappings) { // 拿到CLR属性的信息 var clrProp = mapping.GetType() .GetProperty("ClrProperty", BindingFlags.Instance | BindingFlags.Public) ?.GetValue(mapping) as PropertyInfo; if (clrProp != null) { propNames.Add(clrProp.Name); } } } entityPropsDict.Add(entityName, propNames); } return entityPropsDict; }
怎么用?
很简单,直接调用就行:
using (var dbContext = new MyDbContext()) { var entityProperties = ExtractEntityProperties(dbContext); // 打印结果看看 foreach (var entity in entityProperties) { Console.WriteLine($"实体 {entity.Key} 的属性:"); foreach (var prop in entity.Value) { Console.WriteLine($" - {prop}"); } } }
运行后你会得到一个字典,键是实体类名(比如"A"、"B"),值是对应的属性列表(["property1", "property2"])。
如果你还需要数据库列名这类额外信息,也可以从propertyMappings里进一步提取ColumnName属性,原理是一样的。
内容的提问来源于stack exchange,提问作者Son Do
相关产品推荐
相关产品推荐

