我在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
答案 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()
可以解决此问题。