C# EF6从数据库返回错误的数据

C# EF6从数据库返回错误的数据,c#,sql,sql-server,entity-framework,C#,Sql,Sql Server,Entity Framework,我在ASP.NET项目中使用SQL Server 2016和Entity Framework 6。要初始化主菜单,我将把视图数据提取到C语言的列表变量中: using (var db = new DBEntities()) { ImageGroupList.AddRange(db.vw_image_groups.OrderBy(x => x.id) .ThenBy(x => x.abb

我在ASP.NET项目中使用SQL Server 2016和Entity Framework 6。要初始化主菜单,我将把视图数据提取到C语言的列表变量中:

using (var db = new DBEntities())
{
    ImageGroupList.AddRange(db.vw_image_groups.OrderBy(x => x.id)
                                              .ThenBy(x => x.abbreviation).ToList());
但结果与我在SQLServerManagementStudio中看到的不一样

以下是SSMS中的SQL Server视图查询结果:

此外,我还通过循环打印了“ImageGroupList”值:

foreach (var item in ImageGroupList)
{
     System.Diagnostics.Debug.WriteLine(item.id + ", " + item.parent_id + ", " + item.abbreviation + ", " + item.text + ", " + item.member_count + ", " + item.type + ", " + item.order_index);
结果如下:

当您比较这两个结果时,Entity Framework中缩写列的数据与SQL Server视图结果不同

我搞混了!谁知道这里发生了什么

编辑: 映射细节

从实体框架使用视图时,存在一个微妙的问题

如果您有一个表,要将其与EF一起使用,您需要有一个主键来唯一标识每一行。通常,这是一个单列,例如
ID
或类似的内容

对于视图,您没有“主键”的概念-视图只包含一些表中的一些列

因此,当EF映射视图时,它找不到主键——因此,它将使用视图中所有不可为空的列作为“替换”主键

我不知道在您的情况下这些是什么-您应该能够从
.edmx
模型中分辨出来

当EF去读取数据时,它将读取第一行并为此创建一个对象

当EF读取第二行时,它会注意到“主键”(数据集中所有不可为null的列的集合)与之前相同-因此它不需要创建一个新对象来读取这些值,但主键是相同的,因此它必须是之前已读取的相同对象,所以它使用了这个对象

所以问题是,视图上不能有显式主键

您可以调整EF模型,让EF清楚什么是真正的“主键”(您需要确保这些列都是不可为空的),或者您需要向视图中添加类似“人工”主键的内容(例如使用
行数()OVER()
构造)

通过将此
RowNum
列添加到您的视图中,该列仅对行1、2、…、n进行编号,您将得到一个新的不可为空的列,EF将包含在“替换主键”中,并且由于这些数字是连续的,因此没有两行具有相同的“主键”值,因此不会错误地被已经从数据库中读取的内容替换


更新:@YounesJafari:您的映射正好支持我所说的内容;你的视图的“主键”在(<代码> ID<代码/代码>,代码> PARTRONIDID<代码>)-并且在你的视图的前两行的情况下,那些是<强>相同的< /强> -因此,EF将采取第一行(<代码> ID=0,PalthyID=-1,缩写=EN <代码>)两次-它将考虑从视图中的第二行。(
id=0,parent_id=-1,缩写=fa
)与第一个相同(
id
parent_id
的值相同)..…

可能没有人,因为您没有显示可能导致问题的代码…请向我们显示映射。似乎您对此专栏的映射错误。我上载了映射屏幕截图!这与您的问题无关,但请务必记住,SSMS和基础.NET SQL提供程序可以为sa提供不同的计划由于使用了不同的设置选项,我进行了查询。谢谢大家。问题由@marc_的答案解决。我上传了映射屏幕截图!似乎PK和FK都存在。对……并且您的PK只是id+父id,在您的视图中有重复的值。您必须按照答案所说的做,并使更多列成为PK的一部分或创建一个工件非常感谢@marc_s。是的!我将“缩写”的“EntityKey”改为“True”,现在可以了。这对EF是有利还是不利?@marc_s