通过实体框架获取SQL视图会返回不​​正确的结果

Mar*_*tin 5 c# sql entity-framework

我在SQL Server中有一个非常简单的视图,它看起来像这样,其中ShowLEFT JOINCharacter表的结果:

+---------+----------+----------------------+  
|  Name   | Surname  |         Show         |  
+---------+----------+----------------------+  
| Enoch   | Thompson | The Boardwalk Empire |  
| Anthony | Soprano  | The Sopranos         |  
| Walter  | White    | Breaking Bad         |  
+---------+----------+----------------------+  
Run Code Online (Sandbox Code Playgroud)

当我通过context.CharacterView.ToList()我的应用程序中的Entity Framework获取此表时,结果如下所示:

+---------+----------+----------------------+  
|  Name   | Surname  |         Show         |  
+---------+----------+----------------------+  
| Enoch   | Thompson | The Boardwalk Empire |  
| Anthony | Soprano  | The Boardwalk Empire |  
| Walter  | White    | The Boardwalk Empire |  
+---------+----------+----------------------+  
Run Code Online (Sandbox Code Playgroud)

但是,在DB中,CharacterView 应该是它应该的.


创建视图查询

CREATE VIEW CharacterView AS
SELECT c.Name AS [Name], 
       c.Surname AS [Surname], 
       s.Name AS [Show]

FROM   [dbo].[Characters] AS c LEFT OUTER JOIN
       [dbo].[Shows] AS scen ON c.ShowId = s.Id
Run Code Online (Sandbox Code Playgroud)

tre*_*eat 8

正如@balbelias 在评论中所说的那样添加,.AsNoTracking()为我解决了这个问题。


Deb*_*e A 7

对吧,D.Mac.你解决了我们已经有几个星期的问题了,我们只是去研究它.我们有一个视图,其中EF错误地"推断"了一个非唯一的主键,并且正如您在Martin的SHOW专栏中看到的那样导致数据重复.谢谢.

SQL Server修复 - 将ROW_NUMBER作为唯一ID添加到视图中,如D.Mac建议:SELECT ISNULL(CAST((ROW_NUMBER()OVER(由T.PRODUCT_NAME订购))作为int),0)作为ID等.

现在,实体框架AUTOMATICALLY将ID列包含为VIEW的ENTITY KEY.(右键单击EDMX图中的视图,您应该看到ID标记为ENTITY KEY)

  • 调用.AsNoTracking()也有帮助. (4认同)