2019/2/14

Entity Framework 裡的View,顯示結果不正確 (Entity Framework returns incorrect data from SQL Server view)

我們的專案中,針對某些join非常複雜且使用lambda不易除錯的報表,會先在SQL Server上寫成View或預存程序來呼叫。但某隻報表卻出現奇怪的狀況,原來View的資料是對的,在C#  Entity FrameWork程式碼內下中斷點,看到程式產生的SQL也是對的,但輸出的結果卻荒腔走板。

View的內容只是幾個Table的組合,沒有特別的地方
select COMPANY_CODE,  COMPANY_NAME,  GOODS from SELL_RECORD

1,蘋果,  IPAD
1,蘋果,  IPHONE
2.HTC,  HTC ONE

在EF內則變成

2,蘋果,  IPAD
2,蘋果,  IPHONE
2,HTC,  HTC ONE

後來查了文章  [出處1] [出處2],問題在於查詢的欄位內有COMPANY_CODE這個欄位是查詢結果相關table的第一個主索引鍵,但並不是 Query 結果的真正索引鍵。而Entity FrameWork在將查詢結果轉為物件的過程中,需要在查詢結果內找到有意義的Key值,任其自行推斷會發生恐怖的不測。

最後我們使用 SQL 2005以後即具備的 ROW_NUMBER 方式幫記錄排序,並產生流水序號CID供EF判斷。也別忘了在EF的模型檢式介面,手動將此欄位設定為主索引鍵並重新建置,才能發揮作用。

 ROW_NUMBER() OVER(ORDER BY SomeValue) AS CID