EntityFramework从SQL Server视图返回损坏/交换的数据

Tom*_*bes 5 c# sql-server lambda entity-framework decimal

我有一个简单的查询从SQL Server中的视图:

SELECT [PricePerM]
FROM RealtyStatParent
ORDER BY PricePerM
Run Code Online (Sandbox Code Playgroud)

当我在SQL Management Studio中执行查询时,会得到正确的结果。这意味着我得到了2532行,从1.00开始到173543.6893结束。

当我使用实体框架从C#进行查询时,得到了相同的结果:

var justDecimals = context.RealtyStatParents                
    .OrderBy(item => item.PricePerM)
    .Select(item => item.PricePerM)
    .ToArray();
Run Code Online (Sandbox Code Playgroud)

到现在为止,没有什么特别的。但是我真正不明白的是以下查询。我先选择整行,然后选择价格(十进制)。

var entireRows = context.RealtyStatParents                
    .OrderBy(item => item.PricePerM)        
    .ToArray();

var decimalFromRows = entireRows 
    .Select(item => item.PricePerM)
    .ToArray();
Run Code Online (Sandbox Code Playgroud)

重复很多PricePerM值(值1或48),而不是实际值,并且结果集的顺序不正确。

EF设计器中行的定义很简单:

public partial class RealtyStatParent
{
    public Nullable<decimal> PricePerM { get; set; }
    public int BusinessCategory { get; set; }
    public decimal obec_kod { get; set; }
    public Nullable<int> ParentCategoryId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

更新

我相信这种奇怪的行为与Entity Framework返回不良数据有关,因为视图没有主键。EF决定将Entity Key设置在Column BusinessCategory和obec_kod上,二者组合在一起是唯一的。我希望我离我很近,但还不够。

Tom*_*bes 4

这种奇怪行为的原因已经在这里这里提到过。看起来 EF 内部缓存了整个表,但 EF 选择了错误的唯一键,因此该行中的数据被不同行的数据替换。

此 SELECT 是从视图中进行的。该视图没有主键。EF 决定太聪明了,自己选择主键用于缓存目的。但是 EF 选择了错误的键,我的意思是 EF 只选择了 2 列,每列 4 列。

要修复此问题,请转到 EDMX 模型,右键单击有问题的视图的标题,然后选择“在模型浏览器中显示”。然后检查所有列的 EntityKey 属性是否设置为 true。就这些。

由于 EF 的这一点和其他“功能”,我对 EF 有点失望。这段代码在 LinqToSQL 中运行良好,没有任何魔法。当 LinqToSql 行为正确并且 EF 行为至少有问题或运行时崩溃时,这不是第一个查询。恐怕微软在这里打破了“得到你所期望的模式”。当我查询整个视图时,我只期望简单的代码从视图中获取数据。

在此输入图像描述