SQL 服务器视图在实体框架中返回不同的结果
Posted
技术标签:
【中文标题】SQL 服务器视图在实体框架中返回不同的结果【英文标题】:SQL server view return different results in Entity Framework 【发布时间】:2014-11-08 13:21:26 【问题描述】:我在 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 服务器变为实体框架?
提前感谢
【问题讨论】:
【参考方案1】:确保您在.edmx
文件中的View
已分配主键。如果没有,请使用 edmx 设计器自己添加正确的 entity key
。在这种情况下,您可能希望在实体键中包含 idJob
和 idProduct
列。
另请阅读:http://msdn.microsoft.com/en-us/library/vstudio/dd163156(v=vs.100).aspx
【讨论】:
我有一个主键来完成这项工作。我也在 edmx 设计器中的 productId 列中添加了 entity key = true ,它现在可以工作了。谢谢,虽然我不明白为什么需要这样做? 我不确定,它也发生在我身上,非常烦人。我认为您真正从视图中返回的是一组独特的idJob+idProduct
。并且使用错误的实体键(仅限jobId
),EF
无法正确返回某些其他字段,例如idProduct
。看起来他正在第一次出现您的idProduct
,并为每项工作重复它。让我感到奇怪的是TotalOrdered
看起来不错……
这是否意味着,如果我们有一个 SQL 堆(没有聚集索引的表),我们就不能(正确地)使用实体框架来检索数据?
我很高兴找到了这个答案。呃,我在用实体框架 6 映射 sql 视图时遇到了完全相同的问题,我苦苦挣扎了 2 天。我改变了视图以避免返回空值,并且它起作用了!谢谢大家的cmets!【参考方案2】:
我很欣赏@Vland,他的回答有助于理解问题在于缺少密钥!所以我从根本上解决了问题! 我知道这不是最佳做法,但这些步骤解决了我的问题!
我通过 ROW_NUMBER() 在视图中添加了一行
选择 ROW_NUMBER() over(order by FieldA asc) as id, FieldA, FieldB 来自我的视图
你可以把上面的代码放在你的视图中
我有一个 rowNumber 列用于索引视图行
在 Visual Studio,我更新了 .edmx 图表中的模型并添加了新视图
检查 id 列是否未签名为 Key,右键单击 id 字段并单击“实体密钥” 如果其他列是键符号,请记住取消选中它们。
rebuild & lunch 项目,你可以看到结果是正确的,就像你在 sql server 中看到的那样
【讨论】:
以上是关于SQL 服务器视图在实体框架中返回不同的结果的主要内容,如果未能解决你的问题,请参考以下文章
查询的结果从实体框架查询返回相同的 COLUMN_NAME 值,这没有意义