2012-04-11 39 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