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。在这种情况下,您可能希望在实体键中包含 idJobidProduct 列。

另请阅读: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 服务器视图在实体框架中返回不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用实体框架执行原始 SQL 查询而无需使用模型?

实体框架返回零结果

实体框架查询性能

查询的结果从实体框架查询返回相同的 COLUMN_NAME 值,这没有意义

带有 Sql 视图的实体框架在生成 .sql 文件中显示为表

实体框架显示多个同一行