2010-06-24 49 views
15

我在我的数据库中创建了一个特定视图(用左连接加入大约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 将根据自己设计的 逻辑在应用程序 上执行映射。

当您在数据库端设计您的 视图查询时,考虑这些逻辑 是很重要的。我想 认为你应该做一些调整 你的查看查询。

我不知道你是否已经整理 的问题,如果不是请提供与此相关的 问题 数据库结构和视图查询你有 写的。

感谢宾泽

有人曾经遇到过类似的问题?

回答

17

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

+0

你说得对。我错误地认为它是将我的GUID作为主键,直到我去看了StorageModel和概念模型。它使用一些其他列作为主键,因此也是一团糟。 通过手动更改密钥(不使用VS2008 GUI) – ram 2010-06-24 15:48:35

0

对我来说同样的问题。 的实体视图(VReport)从VS2010向导自动生成是这样的:当我取回的,正确形成SQL查询数据库中的记录,返回预期(和不同的)结果

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

,但实体框架返回了很多重复的记录。

而是还日期列/字段将具有在形成参与*实体键

因此,要解决这个问题,我改变了该领域的财产实体键:假 - >true

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