获取所有模型类型

时间:2015-11-26 00:22:35

标签: c# entity-framework ef-code-first

如何获取属于模型的实体类型列表,以便我可以测试模型实际上是否适用于该实体类型?

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

注意:即使dcx.Set(t)上没有相应的DbSet属性,也可以查询MyDbContext;因此,通过对MyDbContext属性的反思进行迭代是不够的,DbSet<T>的返回类型的通用定义为IDbSet<T>甚至{{1}}。

2 个答案:

答案 0 :(得分:1)

也许是这样的?

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

答案 1 :(得分:0)

感谢@GertArnold 's comment中的链接,我现在正在使用以下内容:

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