2012-06-05 109 views
1

我有兩個具有多對多關係的實體,我正在尋找一種方法來排序表中的結果。
換句話說,當我從table1獲取一行並從table2獲取所有相應的記錄時,我希望能夠爲table1中的該行特定的table2存儲排序順序。實體框架:排序多對多

我的第一個想法是在代表關係的表中添加一個排序列,但據我所知,沒有辦法訪問關係中的新列。

有沒有人有任何建議如何做到這一點?

+0

您是否想對table1行或全局排序table2結果? –

+0

@DannyVarod每table1行。 – JonC

回答

0

謝謝大家對我的問題的好的答案。我現在對於不同解決方案的優缺點更加自信。

我最終做的是這樣的:事實證明,只是向關係表添加一個排序列不會影響模型,從數據庫更新仍然有效,並且該表仍然被映射爲多對多多種關係。然後我創建了一個存儲過程,從關係表中提取排序列,並創建另一個存儲過程來更新指定記錄的排序索引。

1

您可以將新列添加到聯結表中,但該表將成爲一個新實體,因此您的模型現在將包含三個實體,其中兩個一對多關係而不是兩個實體和單個多對多關係。

2

正如Ladislav Mrnka所述,如果將新列添加到聯結表中,那麼會出現一個「中間」的新實體,這將導致導航更加困難。

如果您想要避免這種情況,但仍然可以像往常一樣進行導航,您可以保留聯結表並添加一個新表,就像添加了訂單列的聯結一樣。當您需要訂單信息時,您可以加入此表以獲取並使用它。

這張新表當然需要一些維護。即您可以爲交匯點+訂單到交匯點表創建級聯刪除。並使用一個觸發器(ooops,這不好!)創建一個新的行,併爲每個新創建的關係預設順序。所以,在你的業務邏輯中處理這個問題會更明智。

我知道這太棘手,但沒有神奇的解決方案......只是選擇什麼更舒適。

1

由於您的排序按表1的行表2的結果的要求,而不是全球範圍內,你有三個不優雅的解決方案:

  • 的方法拉吉斯拉夫建議(與難看模型) - 添加順序列, 添加橋樑實體

  • JotaBe建議的方法(與壞看模式) - 添加一個額外的表,並保持兩個

  • 如果上下文用於只讀取(無需改變的關係),你不介意從DB每次更新後手動更改EDMX,那麼你可以黑掉emdx和改變SSDL將關係表定義爲SQL查詢,例如

<EntitySet Name="AS_TO_BS" EntityType="BlaBla.Store.AS_TO_BS"> 
    <DefiningQuery> 
     SELECT ID1, ID2 ORDER BY ORDERVALUE 
     FROM AS_TO_BS 
    </DefiningQuery> 
</EntitySet> 

相反的:

<EntitySet Name="AS_TO_BS" EntityType="BlaBla.Store.AS_TO_BS" 
    store:Type="Tables" Schema="MY_SCHEMA" /> 

看看你是否可以放鬆你的要求,如果沒有則在這三個解決方案之一定居。

編輯:

另一個想法:

  • 使用視圖複製的關係表,然後映射到視圖的關係(如只讀)和訂單實體表(可寫) 。
+0

其他解決方案無意違反,所有3種解決方案都不理想。如果EF支持將關係和實體同時映射到同一個表,最好的解決方案是。 –