获取所有模型类型

本文关键字:类型 模型 获取 | 更新日期: 2023-09-27 18:24:19

如何获得作为模型一部分的实体类型列表,以便测试模型是否真的与该实体类型一起工作?

var dcx = new MyDbContext();
var lst = new List<Type>();
//populate the list here somehow
//...
foreach (var t in lst) {
    var set = dcx.Set(t); //I'm trying to avoid an exception here
    try {
        var test = set.FirstOrDefault();
    } catch (Exception ex) {
        Console.WriteLine("{0} has an error", t);
    }
}

注意:即使在MyDbContext上没有对应的DbSet属性,也完全可以查询dcx.Set(t);因此,仅仅通过反射来迭代返回类型的泛型定义为DbSet<T>甚至IDbSet<T>MyDbContext的属性是不够的。

获取所有模型类型

也许是这样的?

var types = typeof(MyDbContext)
    .GetProperties()
    .Where(prop => prop.PropertyType.IsGenericType)
    .Where(prop => prop.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
    .Select(prop => prop.PropertyType.GenericTypeArguments.First())
    .Distinct();

感谢@GertArnold评论中的链接,我现在使用以下内容:

var dcx = new MyDbContext();
var objContext = ((IObjectContextAdapter)dcx).ObjectContext;
var types = objContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace).Select(x => Type.GetType(x.FullName));
foreach (var t in lst) {
...