SQL Server视图在Entity Framework中返回不同的结果

时间:2014-09-15 04:34:23

标签: .net vb.net entity-framework entity-framework-6 sql-view

我在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服务器更改为实体框架的原因吗?

谢谢你

2 个答案:

答案 0 :(得分:8)

确保View文件中的.edmx分配了主键。如果没有,请使用edmx设计器自行添加适当的entity key。在这种情况下,您可能希望在实体密钥中包含列idJobidProduct

另请阅读此处:http://msdn.microsoft.com/en-us/library/vstudio/dd163156(v=vs.100).aspx

答案 1 :(得分:0)

我很欣赏@Vland,他的回答有助于理解问题是关于缺少钥匙!所以我从根本上解决了问题! 我知道这不是最佳实践,但这些步骤解决了我的问题!

  1. 我通过 ROW_NUMBER() 在视图中添加了一行

    选择 ROW_NUMBER() over(order by FieldA asc) as id, FieldA, FieldB 从我的视图

你可以把上面的代码放在你的视图中

我有一个 rowNumber 列用于索引视图行

  1. 在 Visual Studio 中,我更新了 .edmx 图中的模型并添加了新视图

  2. 检查 id 列是否未签名为 Key,右键单击 id 字段,然后单击“Entity Key” 如果其他列是关键符号,记得取消选中它们。

  3. 重新构建&午餐项目,你可以看到结果是正确的,就像你在sql server中看到的一样