2011-11-21 41 views
1

我有兩個表:如何在Entity Framework中將多個表映射到單個實體,並使用外部聯接?

發票(ID,InternalPrice,ExternalPrice)
帳單摘要(InvoiceID,方差)

在這個應用中,我們有一個過程,通過發票表去,創造實體框架中的對象表示。應用程序必須計算(InternalPrice - ExternalPrice)之間的差異並將其存儲在Variance列中。

爲了允許實體框架在大量行(〜500萬)上有效地執行此操作,我已將計算結果分離爲單獨的表。這允許我使用對象表示來計算方差(加上其他業務邏輯),然後使用「SQL批量插入」將數據快速插入到數據庫中(比正常的實體更新快得多)。

我想合併發票& InvoiceSummary表成一個單一的實體對象,同時保持上述BCP的縱容單獨的表。但InvoiceSummary中可能並不總是有匹配的行。

它看起來像實體框架需要兩個表之間的1到1映射來實現合併的實體。 有誰知道我可以如何讓實體框架用0到1的映射表示?

如果我找不到實體框架解決方案,我可以使用視圖'隱藏'底層表結構。我正在使用支持可更新視圖的SQL服務器,所以這對EF應該是透明的?替代結構解決方案也是受歡迎的。

+0

我試圖使用視圖來創建我正在尋找的實體結構。雖然SQL服務器支持可更新的視圖,但EF似乎創建了一個只讀實體對象。不幸的是,這不太符合我的要求,因爲我需要更新訪問權限。 我知道我可以手動更改EDML以允許更新應用於視圖,但是這些手動編輯需要在每次從數據庫更新模型時重新應用。這似乎是倒退了一步 - 除非有另一種方式? – Matt

回答

1

對於實體拆分(在多個表中拆分單個實體)需要表之間1:1的關係,您的結論是正確的。如果您有能力向數據庫添加視圖,我認爲您最好走這條路線,然後將該視圖映射到單個實體。這個提議的解決方案有一個很大的警告。除非您可以在數據庫中創建可更新視圖,否則您將獲得只讀視圖,並且只能使用EDMX(設計器)映射到只讀視圖。 Code First不支持映射到只讀視圖。

還有其他幾個選項:

  • 如果您不需要查詢的結果,您可以創建存儲在數據庫德程序 。可以將其映射到EDMX 中的某個功能,或者先通過代碼中的功能執行。
  • 如果您確實需要查詢結果並且您正在使用EDMX,我仍然認爲將實體映射到視圖是一種方式。
  • 如果您先使用代碼並且確實需要查詢結果,但是 只讀是可以的,則可以使用dbcontext.database.executecommand。

HTH(並希望我已經得到了所有正確的,因爲它是從記憶......我不相信......這就是爲什麼我在書中寫這些東西了!)

+0

感謝朱莉的迴應。我正在使用SQL Server 2005,因此支持可更新的視圖。 我確實需要存儲方差計算的輸出,因爲在很多情況下,這個計算並不像我上面所做的那樣「吱吱」!但函數映射是一個好主意,我可能會在我的代碼中使用它。 我實際上並沒有先使用代碼 - 但我想兩者都可以工作。 謝謝! – Matt

+0

順便說一句,我感興趣的是你如何在你的應用中結合EF和SQLBulkInsert。我猜他們是完全無關的行動,但如果沒有,是的,非常感興趣! (我有一些想法,但...)隨時脫機脫線,因爲這是完全脫離這篇文章的話題。 [http://thedatafarm.com/blog/contact/] –

+0

我試圖保持兩者緊密聯繫。我會把你的其他細節告訴你。我目前正在通過概念驗證。 – Matt

相關問題