Sql server 2005 如果底层数据没有反映实体主键,EntityFramework4将返回一个混乱的结果

Sql server 2005 如果底层数据没有反映实体主键,EntityFramework4将返回一个混乱的结果,sql-server-2005,stored-procedures,entity-framework-4,Sql Server 2005,Stored Procedures,Entity Framework 4,我们有一个存储过程,其中包含select语句: select convert(int, c.ID) as ID, convert(nvarchar(255), c.name) as name, convert(varchar(32), a.state) as state from customer c join address a on c.addressid = a.ID where c.name like @custNameSpec 在T-S

我们有一个存储过程,其中包含select语句:

select convert(int, c.ID) as ID,
       convert(nvarchar(255), c.name) as name,
       convert(varchar(32), a.state) as state
from   customer c join address a on
       c.addressid = a.ID
where  c.name like @custNameSpec
在T-SQL窗口中执行时,会生成两条记录:

ID  Name    State
1   Robert  PA
2   Rob     VA
在实体框架4中作为函数导入执行时,它返回两条记录,但第一条记录重复:

ID  Name    State
1   Robert  PA
1   Robert  PA
我们删除了函数导入和导入的函数,并重新创建了它,等等。我们还添加了上面的SQL convert语句,以确保Entity Framework理解从服务器返回的数据类型

我们能做些什么来修复它?是什么导致了这样的重复

我们的测试包括:

var myresult3 = myUOW.DC.GetAdDir(todaysdate: null, store_nbr: 14, 
                                  adtype: null).ToList();
var myresult4 = DB.GetAdDir(todaysdate: null, store_nbr: 14, 
                            adtype: null).ToList();
两者都返回相同的错误结果。SQL探查器显示此调用:

exec [dbo].[GetCust] @todaysdate=NULL,@custNameSpec='Rob',@adtype=NULL
编辑:

显然,商业规则改变了。从实体框架生成的POCO的主键设置不正确,因此它返回了正确数量的字段,但通过基于POCO主键字段使所有重复项相同来删除重复项


其他远程相关问题中引用了MergeOption,这可能解释了为什么会发生这种情况。

当您对实体(如主键)创建唯一限制,并且数据中有重复项时,实体框架将为找到的每个重复项的所有字段重复第一个重复记录

换句话说,如果底层数据不能正确反映主键,EntityFramework将返回一个混乱的结果