2012-04-11 104 views
2

的表和列我有名字BookLibrary数据库与3个表AuthorPayrollArticle。我正在使用实体框架来连接到数据库。我创建了它的一个实例。遍历一个Entity Framework对象

BookLibrary bookLibraryContext = new BookLibrary(); 

现在我想在数据集中传递这个(将数据集作为参数传递)。怎么做?

同样通过使用模板T4我想生成所有列名作为只读字符串属性。为此,我需要循环访问数据库中的所有表和列名称(并且我想通过我的实体对象bookLibraryContext执行此操作)。但我不确定如何遍历实体对象的所有表和列?我在谷歌搜索它,但许多人建议使用反射循环或直接使用SQL。我想通过C#来完成,而我对Reflection并不熟悉。

回答

2

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

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

如果你想与数据集工作,不使用实体框架。直接使用数据集。

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

实体对象没有这些信息。此信息隐藏在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)) 
    { 

    } 
} 
+0

我创造了这个代码的方法,我把它叫做形式的Load事件。当代码达到'context.MetadataWorkspace.GetItems (DataSpace.SSpace)',我的形式出现,代码的其他部分并没有在所有 – Sandy 2012-04-13 10:02:16

+1

达到确保你已经使用EF查询或持久化数据调用此代码之前。否则'MetadataWorkspace'不会被完全初始化。 – 2012-04-13 10:20:40