繁体   English   中英

如何从 DbContext 获取所有 DbSet

[英]How to get all DbSet from DbContext

我需要使用 EF 获取数据库中的所有表。 我需要他们逐表 go 并从每个表中提取某些信息。 知道怎么做吗?

这是我在EntityFramework Plus库中使用的扩展方法。

using (var ctx = new TestContext())
{
    var dbSetProperties = ctx.GetDbSetProperties();
    List<object> dbSets = dbSetProperties.Select(x => x.GetValue(ctx, null)).ToList();
}

public static class Extensions
{
    public static List<PropertyInfo> GetDbSetProperties(this DbContext context)
    {
        var dbSetProperties = new List<PropertyInfo>();
        var properties = context.GetType().GetProperties();

        foreach (var property in properties)
        {
            var setType = property.PropertyType;

#if EF5 || EF6
            var isDbSet = setType.IsGenericType && (typeof (IDbSet<>).IsAssignableFrom(setType.GetGenericTypeDefinition()) || setType.GetInterface(typeof (IDbSet<>).FullName) != null);
#elif EF7
            var isDbSet = setType.IsGenericType && (typeof (DbSet<>).IsAssignableFrom(setType.GetGenericTypeDefinition()));
#endif

            if (isDbSet)
            {
                dbSetProperties.Add(property);
            }
        }

        return dbSetProperties;

    }
}

编辑您需要使用DbSet元素类型的反射并迭代所有属性。 这不适用于TPC,TPT和TPH

有关更简单的解决方案,请使用Entity Framework Extensions中的GetModel方法。 这是该库的免费功能。

项目: 实体框架扩展

文档: GetModel

免责声明 :我是项目实体框架扩展的所有者

 EntityContainer container = ObjectContext.MetadataWorkspace.GetEntityContainer(ObjectContext.DefaultContainerName, DataSpace.CSpace);
            List<string> result = (from meta in container.BaseEntitySets
                      where meta.BuiltInTypeKind == BuiltInTypeKind.EntitySet
                      select meta.ElementType.ToString()).ToList<string>();

你可以使用这样的东西来获取表的列表,然后循环并获得你需要的信息:

var db = new myContext().GetAllTableProperties().ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM