【问题标题】:SQL server view return different results in Entity FrameworkSQL 服务器视图在实体框架中返回不同的结果
【发布时间】: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 服务器变为实体框架?

提前感谢

【问题讨论】:

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


    【解决方案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,他的回答有助于理解问题在于缺少密钥!所以我从根本上解决了问题! 我知道这不是最佳做法,但这些步骤解决了我的问题!

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

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

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

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

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

    2. 检查 id 列是否未签名为 Key,右键单击 id 字段并单击“实体密钥” 如果其他列是键符号,请记住取消选中它们。

    3. rebuild & lunch 项目,你可以看到结果是正确的,就像你在 sql server 中看到的那样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2014-06-12
      • 2011-12-09
      • 2015-09-25
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多