循环遍历Entity框架对象的表和列

时间:2012-04-11 16:42:46

标签: c# entity-framework c#-4.0 entity-framework-4

我有一个名为BookLibrary的数据库,其中有3个表AuthorPayrollArticle。我正在使用Entity框架连接到数据库。我创建了它的一个实例。

BookLibrary bookLibraryContext = new BookLibrary();

现在我想将其转换为数据集(将数据集作为参数传递)。怎么做?

同样通过使用T4模板,我想生成所有列名作为只读字符串属性。为此,我需要循环遍历数据库中的所有表和列名称(我想通过我的实体对象bookLibraryContext执行此操作)。但我不知道如何循环实体对象的所有表和列?我在google上搜索过它,但很多人建议使用Reflection进行循环或直接使用SQL。我想通过C#来做,我对Reflection不是很熟悉。

1 个答案:

答案 0 :(得分:2)

  

现在我想将其转换为数据集(将数据集作为参数传递)。怎么做?

手动。 EF和数据集是完全不同的技术,它们都不包含任何转换到另一个的支持。因此,您必须手动创建要使用的数据集和所有数据表,并从上下文中手动填充它们。

如果您想使用数据集,请不要使用Entity框架。直接使用数据集。

  

但我不确定如何遍历实体对象的所有表和列?

实体对象没有此信息。此信息隐藏在EF映射的深处,可通过bookLibraryContext.MetadataWorkspace获得。您不需要反射来获取此信息。您只需要了解EDM及其存储信息的方式。

尝试这样的事情:

foreach (var entityType in context.MetadataWorkspace
                                  .GetItems<EntityType>(DataSpace.SSpace))
{
     string tableName = entityType.MetadataProperties
                                  .Single(m => m.Name == "Name")
                                  .Value
                                  .ToString();

     var members = (ReadOnlyMetadataCollection<EdmMember>)entityType
                                              .MetadataProperties
                                              .Single(m => m.Name == "Members")
                                              .Value;

     foreach (var columnName in members.Select(m => m.Name))
     {

     }
}