实体框架导致数据库视图的差异

时间:2010-06-24 14:52:13

标签: linq-to-sql entity-framework linq-to-entities

我在我的数据库中创建了一个特定的视图(使用左连接加入约5-6个表)。这个视图被添加到我的edmx(实体框架1.0)中。最近我注意到使用edmx(linq到实体然后ToList())获得的一个列记录多次重复,尽管在数据库视图中它们是不同的

Column-N (Expected result/ result from DB view)
---------
data1
data2
data3
data4
data5

Column-N(Actual result generated by entity framework)
---------
data1
data1
data1
data1
data1

我启动了我的SQL分析器,得到了我的应用程序发送到SQL Server的查询,运行它并返回给我预期的结果。

MSDN有类似的帖子herehere,但主持人尚未详细说明如何解决此问题。我的密钥碰巧是GUID

  

你认为我指出的根本原因   是正确的,问题出在了   应用程序端EF映射,如EF所示   不同的对象映射规则   数据库。当查询结果有   EF从数据库返回   将在应用程序上进行映射   记忆根据自己的设计   逻辑。

     

采取这些逻辑非常重要   当你设计你的时候考虑到   查看数据库端的查询。一世   认为你应该做一些调整   您的查看查询。

     

我不确定你是否已经分类   问题,如果没有请提供   与此相关的数据库结构   问题和您拥有的查看查询   写入。

     

谢谢Binze

之前有人遇到类似的问题吗?

2 个答案:

答案 0 :(得分:18)

问题实际上是关键。您必须a)为视图中的每一行都有唯一的标识符。和b)相应地在edmx中映射该密钥。否则,正如您的引用所述,映射逻辑将看到每个后续行和数字,它可以使用它之前返回的相同对象实例

答案 1 :(得分:0)

对我来说同样的问题。 从VS2010向导自动生成实体视图(VReport),类似于:

class VReport
Line: int (key) 
Desc: string 
Date: DateTime

当我从数据库中检索记录时,SQL查询正确形成并返回了预期的(和不同的)结果,但实体框架却返回了大量重复的记录。

但相反,Date列/字段也必须在实体键的形成中占用

因此,要解决此问题,我从实体密钥更改了字段的属性:false - >的

class VReport
Line: int (key) 
Desc: string 
Date: DateTime (key)