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

时间:2012-11-06 12:17:18

标签: c# sql entity-framework

我在SQL Server中有一个非常简单的视图,看起来像这样,其中显示 LEFT JOIN 字符的结果表:

+---------+----------+----------------------+  
|  Name   | Surname  |         Show         |  
+---------+----------+----------------------+  
| Enoch   | Thompson | The Boardwalk Empire |  
| Anthony | Soprano  | The Sopranos         |  
| Walter  | White    | Breaking Bad         |  
+---------+----------+----------------------+  

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

+---------+----------+----------------------+  
|  Name   | Surname  |         Show         |  
+---------+----------+----------------------+  
| Enoch   | Thompson | The Boardwalk Empire |  
| Anthony | Soprano  | The Boardwalk Empire |  
| Walter  | White    | The Boardwalk Empire |  
+---------+----------+----------------------+  

但是,在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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

如@balbelias在评论中所说的那样添加.AsNoTracking()可以解决此问题。