Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过实体框架获取SQL视图会返回不正确的结果_C#_Sql_Entity Framework - Fatal编程技术网

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

C# 通过实体框架获取SQL视图会返回不正确的结果,c#,sql,entity-framework,C#,Sql,Entity Framework,我在SQL Server中有一个非常简单的视图,看起来像这样,Show是带有字符的左连接的结果: +---------+----------+----------------------+ | Name | Surname | Show | +---------+----------+----------------------+ | Enoch | Thompson | The Boardwalk Empire | | Anthony

我在SQL Server中有一个非常简单的视图,看起来像这样,Show是带有字符的左连接的结果:

+---------+----------+----------------------+  
|  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是它应该的样子


创建视图查询
创建视图角色视图为
选择c.名称作为[名称],
c、 姓为[姓],
s、 名称为[显示]
来自[dbo]。[Characters]作为c左外联接
[dbo].[Shows]在c.ShowId=s.Id上显示为scen


右上,D.Mac。你解决了我们几个星期来遇到的一个问题,我们才开始研究它。我们有一个视图,其中EF错误地“推断”了一个主键,该主键不是唯一的,并且导致了数据重复,正如您在Martin的SHOW专栏中看到的那样。谢谢

SQL Server修复程序-如D.Mac所建议,将行号作为唯一ID添加到视图中: 选择ISNULL(CAST((ROW_NUMBER()OVER(order by T.PRODUCT_NAME))作为int),0)作为ID,等等


现在,EntityFramework自动包含ID列作为视图的实体键。(右键单击EDMX图表中的视图,您应该会看到标记为实体键的ID)

添加
.AsNoTracking()
,正如@balbelias在评论中为我修复的那样

您如何知道查询正在返回您提到的结果?您正在调试器中查看它吗?还是正在产生产出?如果是输出,那么让我们看看您用来显示它的代码。我提到的输出结果来自调试器。要澄清一点-问题是
上下文.CharacterView.ToList()
包含
显示的
数据库中不存在。CharacterView
-即EF不能正确反映数据库。感谢您提出的问题和以下答案。EF设计器给出了一个“错误”提示:警告6002:表/视图“yourView”没有定义主键。已推断出键,并将定义创建为只读表/视图。我为搜索此警告的用户添加了此消息。调用.AsNoTracking()也有帮助。@balbelias:添加.AsNoTracking()确实有效。但不明白怎么做?如果是因为没有PK,那么AsNoTracking有什么帮助?有什么想法吗?@milind thakkar我假设EF使用键值存储在上下文中存储加载的实体,它显然使用PK作为键。由于没有唯一的PK,加载的数据在插入这些存储后变得无效(某些行丢失)。使用.AsNoTracking()可以使EF不使用这些存储,而只是将数据加载并映射到POCO类。上面答案中的解决方案之所以有效,是因为它添加了唯一的PK(行号),键值存储开始正常工作。添加.AsNoTracking()作为答案@balbelius,请随意添加答案,我将删除关于如何使用.AsNoTracking()的好文章。我从来没有听说过。