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

时间:2015-12-07 23:09:22

标签: c# sql-server entity-framework lambda decimal

我从SQL Server中的视图中进行简单查询:

SELECT [PricePerM]
FROM RealtyStatParent
ORDER BY PricePerM

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

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

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

直到现在没什么特别的。但我真正不理解的是跟随查询。我先选择整行,然后选择价格(十进制)。

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

var decimalFromRows = entireRows 
    .Select(item => item.PricePerM)
    .ToArray();

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; }
}

enter image description here

更新

我相信这种奇怪的行为与Entity Framework returning bad data有关,因为视图没有主键。 EF决定实体密钥在Column BusinessCategory和obec_kod上,它是唯一的组合。我希望我更接近,但仍然不够。

1 个答案:

答案 0 :(得分:2)

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

此SELECT由视图构成。此视图没有主键。 EF决定过于聪明,并选择自己的主键用于缓存目的。但EF选择了错误的密钥,我的意思是EF只选择了2列中的4列。

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

由于这个以及其他特征和#34;对EF我有点失望。这个代码在LinqToSQL中运行良好,没有任何魔法。当LinqToSql行为正常且EF行为至少有问题或崩溃运行时,它不是第一个查询。我担心微软正在打破&#34;得到你期望的模式&#34;这里。当我查询整个视图时,我只期望从视图中获取数据的简单代码。

enter image description here