在这里我遇到了一些奇怪的情况。
我在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错误
请帮帮我。
提前致谢。
答案 0 :(得分:0)
我不知道您的EF模型是什么样的 - 但实体框架中的观点问题通常归结为:
由于默认情况下视图没有主键,因此EF将根据视图中保证为NOT NULL
这些列可能(或可能不会)制作好的代理主键
当EF加载数据时,它会查看主键中的那些列;如果已经从数据库加载了具有相同EntityKey
的实体,EF将不再次加载数据,但引用它已在内存中的实体
所有这些可以在使用视图的EF上导致意外结果。
围绕这个有很多解决方案:
确保在视图中包含所有包含的基表中的所有主键;这样,表格的主键 肯定会成为EF视图的代理主键的一部分,因此它们将保证唯一性
通过以下方式创建您自己的单个伪主键您视图中的ROW_NUMBER()
列,只是为了确保每一行都具有该行唯一的内容,以防止EF“短路”实体,因为它认为它已经加载了该实体...