强制EF返回视图中所有行的最佳方法是什么?

时间:2012-04-30 02:19:01

标签: entity-framework-4

我有一个视图,其中一个连接列可以为空,但通常是两行之间唯一的区别项。我看到EF在视图中的所有非可空项目中构建了一个主键。我注意到,当我从视图中拉出时,这个可以为空的列并不总是正确返回,我读到它与映射到键的方式有关,如果它看到键就会返回同一行已经存在。

理想情况下,最好的解决方案是让我的列不可为空,但如果不引起更大的问题我就不能这样做。

另一个想法是使用ROW_NUMBER()制作主键。我不确定这是否会导致类似的问题(如果上下文没有在调用之间刷新,它会完全取消,还是足够聪明地意识到查询不同?)我还担心需要{{{ 1}}用于函数以及它将如何影响行的动态排序。

确保我的所有行的返回方式与通过SQL查询显示的最佳方式的最佳方法是什么?

谢谢..

示例:

ORDER BY

EF会返回类似的内容:

view: A int, B int, C int?

SQL Results:
1, 2, null
1, 3, 10
1, 3, 11

我也需要11点。

1 个答案:

答案 0 :(得分:3)

这是由于身份地图模式造成的。默认情况下,EF跟踪已加载的实体(由实体密钥标识) - 如果结果集包含重复的实体密钥,则EF认为它与已加载的实体相同,并且不为这些实体创建新的实体实例重复记录 - 而是使用为该第一个记录创建的实例。这对于更改跟踪以及将更改保存回数据库的能力是必需的。

在您的情况下,您很可能不希望将更改保存回数据库,因为这些记录不会为您提供必要的信息。因此,在没有更改跟踪的情况下加载记录,它应该跳过身份映射模式,并为结果集中的每个记录生成新的实体实例:

context.YourEntitySet.MergeOption = MergeOption.NoTracking; 
// Now execute your query