我在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服务器更改为实体框架的原因吗?
谢谢你
答案 0 :(得分:8)
确保View
文件中的.edmx
分配了主键。如果没有,请使用edmx设计器自行添加适当的entity key
。在这种情况下,您可能希望在实体密钥中包含列idJob
和idProduct
。
另请阅读此处:http://msdn.microsoft.com/en-us/library/vstudio/dd163156(v=vs.100).aspx
答案 1 :(得分:0)
我很欣赏@Vland,他的回答有助于理解问题是关于缺少钥匙!所以我从根本上解决了问题! 我知道这不是最佳实践,但这些步骤解决了我的问题!
我通过 ROW_NUMBER() 在视图中添加了一行
选择 ROW_NUMBER() over(order by FieldA asc) as id, FieldA, FieldB 从我的视图
你可以把上面的代码放在你的视图中
我有一个 rowNumber 列用于索引视图行
在 Visual Studio 中,我更新了 .edmx 图中的模型并添加了新视图
检查 id 列是否未签名为 Key,右键单击 id 字段,然后单击“Entity Key” 如果其他列是关键符号,记得取消选中它们。
重新构建&午餐项目,你可以看到结果是正确的,就像你在sql server中看到的一样