实体框架使用LEFT JOIN语句为视图返回错误数据

Ser*_*diy 10 c# sql entity-framework

我遇到了Entity Framework的奇怪行为.EF生成的DbContext对象返回与数据库中的实际数据不同的数据.

请考虑以下数据库架构: 数据库架构

Letter 数据:

Id      Value   LanguageId
------- ------- ----------
1       A       1
2       A       2
3       B       1
4       B       2
Run Code Online (Sandbox Code Playgroud)

Language 数据:

Id      Value
------- -------
1       English
2       Russian
Run Code Online (Sandbox Code Playgroud)

我也有以下简单的观点LetterLanguageView.请注意,它使用LEFT JOIN子句,因为Letter.LanguageId可能是NULL:

SELECT dbo.Letter.Value as Letter, dbo.Language.Value as Language
FROM dbo.Letter
LEFT JOIN dbo.Language ON dbo.Letter.LanguageId = dbo.Language.Id
Run Code Online (Sandbox Code Playgroud)

这个视图的结果非常简单:

Letter  Language
------- --------
A       English
A       Russian
B       English
B       Russian
Run Code Online (Sandbox Code Playgroud)

但是,当我从Entity Framework使用此视图时,我得到以下结果:

错误的数据

如您所见,该Language物业是错误的,根本没有俄语.

如果您想知道,这是用于读取此数据的代码段:

using (var e = new TestEntities())
{
    var data = e.LetterLanguageView;
}
Run Code Online (Sandbox Code Playgroud)

没有什么特别的,没有转换或对返回数据的任何修改,所以看起来问题出在实体框架本身.

你能否提出任何想法,为什么EF在这种情况下会返回错误的数据?我该如何解决这个问题?

Eri*_*rer 12

在您的EF模型中确保LetterLanguageView将Letter和Language设置为EntityKey = true.

我过去使用的另一个技巧是添加一行Id列并使其成为PK.这是关于它的某人(不是我)的博客

http://girlfromoutofthisworld.com/entity-framework-and-setting-primary-keys-on-views/

  • 哇,这有帮助.谢谢! (2认同)
  • 谢谢.有同样的问题,但我的头痛现在是过去. (2认同)