0

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

我在 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 中运行选择查询时,它会显示我想要的确切输出

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 错误

请帮我。

提前致谢。

4

1 回答 1

0

我不知道您的 EF 模型是什么样的 - 但 Entity Framework 中的视图问题通常归结为:

  • 由于默认情况下视图没有主键,EF 将根据视图中保证为的所有列“推断”一个“实体键”NOT NULL

  • 这些列可能(或可能不会)成为一个好的代理主键

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

所有这些加在一起可能会导致使用视图在 EF 上产生意想不到的结果。

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

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

  • 通过在您的视图中添加一个例如列来创建您自己的单个ROW_NUMBER()主键,以确保每一行都有该行独有的东西,以防止 EF 因为它认为它已经加载而“短路”实体实体...

于 2013-05-10T09:59:45.630 回答