Dot-Net

SQL 伺服器視圖在實體框架中返回不同的結果

  • March 29, 2021

我在 SQl 伺服器中有一個 sql 視圖:

SELECT        dbo.job.idJob, SUM(dbo.tracking.iQty) AS TotalOrdered, dbo.tracking.idProduct
FROM            dbo.tracking INNER JOIN
                        dbo.job ON dbo.tracking.idJob = dbo.job.idJob
GROUP BY dbo.tracking.idAction, dbo.tracking.idProduct, dbo.job.idJob

在 SQL Server 中,它返回:

idJob       TotalOrdered idProduct
----------- ------------ -----------
5000        150          9
5000        75           18
5006        20           3

問題:

當我在 WPF 4.5 項目​​中通過 Entity Framework 6 訪問此視圖時,它返回不同的結果。我將視圖添加到 edmx 文件中,然後按以下方式呼叫視圖:

Public Function GetTracking_Ordered(idJob As Integer) As Collection(Of vw_Tracking_Ordered) Implements ITrackingDataService.GetTracking_Ordered
           Try
               Using context = _ModelService.NewContext

                   Dim trackingList = (From recs In context.vw_Tracking_Ordered Where recs.idJob = idJob Select recs).ToList
                   Return New Collection(Of vw_Tracking_Ordered)(trackingList)

               End Using
           Catch ex As Exception
               Return Nothing
           End Try
       End Function

結果如下:

idJob       TotalOrdered idProduct
----------- ------------ -----------
5000        150          9
5000        75           9
5006        20           3

注意 5000 作業的 idProduct 現在都是 9 而不是 9 和 18。

問題:

誰能幫我調試一下為什麼這個結果會從 SQL Server 更改為 Entity Framework?

提前致謝

確保您View.edmx文件中分配了**主鍵。**如果沒有,請entity key使用 edmx 設計器自己添加正確的。在這種情況下,您可能希望在實體鍵中包含列idJobidProduct

另請閱讀此處:http: //msdn.microsoft.com/en-us/library/vstudio/dd163156 (v=vs.100).aspx

我很欣賞@Vland,他的回答有助於理解問題是關於失去的關鍵!所以我從根本上解決了問題!我知道這不是最佳實踐,但這些步驟解決了我的問題!

  1. 我通過 ROW_NUMBER() 在視圖中添加了一行

選擇 ROW_NUMBER() over(order by FieldA asc) as id, FieldA, FieldB from MyView

你可以把上面的程式碼放在你的視圖中

我有一個 rowNumber 列用於索引視圖行

  1. 在 Visual Studio 中,我更新了 .edmx 圖中的模型並添加了新視圖
  2. 檢查 id 列是否未簽名為 Key,右鍵點擊 id 欄位並點擊“Entity Key”,如果它們是鍵符號,請記住取消選中其他列。
  3. 重建和午餐項目,你可以看到結果是正確的,你可以在 sql server 中看到

引用自:https://stackoverflow.com/questions/25840878