0

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

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

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

确保我的所有行都完全按照它们通过 SQL 查询出现的方式返回,并且对性能的影响最小的最佳方法是什么?

谢谢..

例子:

view: A int, B int, C int?

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

EF 将返回如下内容:

1, 2, null
1, 3, 10
1, 3, 10

我也需要得到那个11。

4

1 回答 1

3

这是由于身份映射模式而发生的。默认情况下,EF 跟踪已加载的实体(由实体键标识) - 如果结果集包含重复的实体键 EF 认为它与已加载的实体相同,并且不会为这些实体创建新的实体实例重复记录 - 相反,它使用为具有该键的第一条记录创建的实例。这对于更改跟踪和将更改保存回数据库的能力是必要的。

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

context.YourEntitySet.MergeOption = MergeOption.NoTracking; 
// Now execute your query
于 2012-04-30T08:50:26.087 回答