2016-02-04 69 views
2

我需要使用EF获取数据库中的所有表。我需要他们一个一个地一桌一桌地从每个桌子上提取一些信息。任何想法如何?如何从DbContext获取所有DbSet

+0

您需要获取所有DbSet或所有表吗?你的问题与标题不清楚。 –

+0

DbSet与表格相同。 – Richard

+0

你为什么需要这样做?如果使用EF,根据数据库的大小,可能需要很长时间才能执行。 – mikeyq6

回答

6

这是我在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

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

+0

以及我如何遍历每个表或DbSet的属性? – Richard

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

你可以使用这样的事情得到一个列表的表格,然后循环浏览并获取所需的信息:

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

GetAllTableProperties()。ToList();没有出现 – Richard