2011-05-17 20 views
2

我有一個使用EF4訪問SQL Server數據存儲的庫。出於不同的原因,我必須使用SQL Server特定的語法從商店讀取數據(用於自由文本搜索),所以我必須手動創建SQL代碼並通過ExecuteStoreQuery方法發送它。從單個Entity Framework ExecuteStoreQuery請求中讀取多個表。

這工作正常,除了查詢使用聯接請求幾個表旁邊的主要(主要是一個我指定爲調用ExecuteStoreQuery時目標實體集),並且EF永遠不會填滿主要實體的關係屬性與其他表的數據。

有沒有什麼特別的事情來填補這些關係?使用其他EF方法或在查詢中使用特殊的表名或其他?

感謝您的幫助。

回答

3

好吧,我會在這裏寫下我最終做的事情,這看起來不是一個完美的解決方案,但在這種情況下似乎並沒有任何完美的解決方案。

As Ladislav指出,ExecuteStoreQuery(以及其他「自定義查詢」方法,Translate)只映射您指定的實體的列,而將所有其他列留在一邊。因此,我不得不單獨加載相關性,如下所示:

// Execute  
IEnumerable<MainEntity> result = context.ExecuteStoreQuery<MainEntity>(strQuery, "MainEntities", MergeOption.AppendOnly, someParams).ToArray(); 

// Load relations, first method 
foreach (MainEntity e in result) 
{ 
    if (!e.Relation1Reference.IsLoaded) 
     e.Relation1Reference.Load(); 
    if (!e.Relation2Reference.IsLoaded) 
     e.Relation2Reference.Load(); 
    // ... 
} 

// Load relations, second method 
// The main entity contains a navigation property pointing 
// to a record in the OtherEntity entity 
foreach(OtherEntity e in context.OtherEntities) 
    context.OtherEntities.Attach(e); 

那裏。我認爲這兩種技術必須根據生成請求的數量和大小來選擇。第一種技術會爲每個需要的邊記錄生成一個記錄請求,但不會加載任何不安全的記錄。第二種技術使用較少的請求(每個表一個),但檢索所有記錄,以便使用更多內存。

3

執行直接SQL遵循非常簡單的規則:它使用結果集中的列來填充物化實體中具有相同名稱的屬性。我想我在某處讀到,這隻適用於您實現的主要實體(實體類型在ExecuteStoreQuery中定義=無關係),但我現在找不到它。我做了幾個測試,它確實沒有填充任何關係。

+0

該屬性看起來很挑剔。如果您在「選擇」中有一列,並且該屬性不在該實體上,它不會那樣。 (「我期待這一點)。如果對象中有一個屬性不在「結果」中,則它不會那樣。 (「我不期待這個) – granadaCoder 2014-01-07 22:18:18