WCF返回错误的视图输出

时间:2013-05-10 09:50:30

标签: wcf

在这里我遇到了一些奇怪的情况。

我在SQL Server中创建了一个视图

Create View [Adm].[VwSurveyReport]
as 
SELECT q.QuestionID,q.Question,p.dtStart,p.dtEnd,u.OrgCode,u.UserID,u.RoleID,
(case tc.blanswer 
when 1 then 1 
when 0 then 0
end) as AnsYes,
(case tc.blanswer 
when 1 then 0 
when 0 then 1
end) as AnsNo
from dbo.SurveyQuestions as q
left outer join dbo.surveyTransChild as tc on tc.questionID=q.questionID
left outer join dbo.surveyTransParent as tp on tp.SurveyTransID=tc.SurveyTransID
left outer join dbo.SurveyParent as p on p.surveyID=tp.surveyID
left outer join adm.masFEUser as u on tp.Userid=u.Userid
where p.dtStart IS Not NULL
GO

我背后的代码是

List<ThePayWcfRef.VwSurveyReport> data = new List<ThePayWcfRef.VwSurveyReport>();
data =  (from v in entities.VwSurveyReports
     where 1 == 1 
     select v).ToList();

当我在SQL Server中运行select查询时,它显示了我想要的确切输出

UserID  RoleID  AnsYes  AnsNo
m6018upl    2   1   0
m6018upl    2   1   0
m6018app1   4   1   0
m6018app1   4   0   1

但在我的代码背后,我将错误的数据输入“数据”列表

UserID  RoleID  AnsYes  AnsNo
m6018app1   4   1   0
m6018app1   4   0   1
m6018app1   4   1   0
m6018app1   4   0   1

AnsYes,AnsNo和UserID错误

请帮帮我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不知道您的EF模型是什么样的 - 但实体框架中的观点问题通常归结为:

  • 由于默认情况下视图没有主键,因此EF将根据视图中保证为NOT NULL

  • 这些列可能(或可能不会)制作好的代理主键

  • 当EF加载数据时,它会查看主键中的那些列;如果已经从数据库加载了具有相同EntityKey的实体,EF将再次加载数据,但引用它已在内存中的实体

所有这些可以在使用视图的EF上导致意外结果。

围绕这个有很多解决方案:

  • 确保在视图中包含所有包含的基表中的所有主键;这样,表格的主键 肯定会成为EF视图的代理主键的一部分,因此它们将保证唯一性

  • 通过以下方式创建您自己的单个主键您视图中的ROW_NUMBER()列,只是为了确保每一行都具有该行唯一的内容,以防止EF“短路”实体,因为它认为它已经加载了该实体...