如何从DbContext获取所有的DbSet。

12

我需要使用EF获取数据库中的所有表格。我需要逐个表格地提取每个表格中的特定信息。有什么想法吗?


你需要获取所有的DbSet还是所有的表格?你问题的标题不够清晰。 - Jonathan Magnan
1
DbSet与表格相同。 - Richard
为什么需要这样做?如果使用EF,根据数据库大小,执行起来可能需要很长时间。 - mikeyq6
我需要迭代 DbContext 中的每个表或 DbSet,以从数据库中的每个表中提取信息。 - Richard
为什么?你能解释一下你需要从每个表中获取哪些信息以及你打算如何处理它吗?当你说某些数据时,这些数据是如何被过滤的?你应该能够轻松迭代DBSets,我只是想不出你为什么要这样做。 - David McLean
我正在尝试使用EF作为数据库同步器的代码,然后从数据库A中提取每个表的所有信息,并与数据库B中的信息进行比较。这是请求。 - Richard
2个回答

23

这是我在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方法。这是该库的免费功能。

项目:Entity Framework Extensions

文档:GetModel

免责声明:我是Entity Framework Extensions项目的所有者


3
我该如何迭代每个表或DbSet的属性? - Richard
dbSets中的值即使在迭代中也无法访问。 List <object> dbSets = dbSetObjs.Select(x => x.GetValue(ctx, null)).ToList(); foreach (var dbSet in dbSets) { var obj = dbSet; } - Stephen Himes

0
 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>();

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