如何获取所有的DbContext类和每个DbContext下的所有DbSet?

3
我正在参与一个大型项目,其中有50多个DbContext和每个DbContext下有100多个DbSet
每个DbContext由单独的团队处理,并根据他们的需求/更改添加/删除DbSet
从集中式视图/报告中,我想以父子视图查看所有DbContext类和每个DbContext下的所有DbSet,以管理数据库。
如何在LinQ查询或C#函数中获取所有DbContext类和每个DbContext下的所有DbSet
使用以下代码,我获得了DbContext下的DbSets列表,但在我的情况下,可能会有新的DbContext
var metadata = ((IObjectContextAdapter)dbContext).ObjectContext.MetadataWorkspace;

var tables = metadata.GetItemCollection(DataSpace.SSpace)
                     .GetItems<EntityContainer>()
                     .Single()
                     .BaseEntitySets
                     .OfType<EntitySet>()
                     .Where(s => !s.MetadataProperties.Contains("Type")
                                 || s.MetadataProperties["Type"].ToString() == "Tables");

foreach (var table in tables)
{
    var tableName = table.MetadataProperties.Contains("Table")
                    && table.MetadataProperties["Table"].Value != null
                    ? table.MetadataProperties["Table"].Value.ToString()
                    : table.Name;

    var tableSchema = table.MetadataProperties["Schema"].Value.ToString();

    Console.WriteLine(tableSchema + "." + tableName);
}

我正在寻找一个动态列表,其中应该包括新的DbContext。

如何在Linq查询或C#函数中获取所有DbContext类和每个DbContext下的所有DbSet。


2
一个拥有50多个数据库的单一项目? - Marco Salerno
不,更糟糕的是:只有一个数据库(“数据库”),而多个不同的DbContext类代表这一个唯一的数据库。这将成为未来的问题制造者。 - Harald Coppoolse
1个回答

3
如何尝试以下内容:

如何尝试以下内容:

public Dictionary<Type, List<object>> FindDbContextsInAssemblies()
{
   var dbContexts = new Dictionary<Type, List<object>>();

   var assemblies = AppDomain.CurrentDomain.GetAssemblies();

   foreach(var assembly in assemblies)
   {
      foreach(var type in assembly.GetTypes())
      {
         if(type.IsSubclassOf(typeof(DbContext)))
         {
            // Instantiate DbContext:
            var context = type.GetConstructor(Array.Empty<Type>()).Invoke(Array.Empty<object>());

            // Find method to get entities:
            var model = type.GetProperty("Model");
            var searchMethod = model.PropertyType.GetMethod("GetEntityTypes");

            // Get registered entities:
            var entities = searchMethod.Invoke(model.GetValue(context, null), null) as List<object>;

            dbContexts[type] = entities;
         }
      }
   }

   return dbContexts;
}

我没有测试过这个方法。这个想法是通过查找程序集,找到相关的类,并动态调用GetEntityTypes()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接