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

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

《c# – EntityFramework从SQL Server View返回损坏/交换的数据》

UPDATE

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

最佳答案 这种奇怪行为的原因已经提到
here
here.似乎EF内部缓存整个表,但EF选择了错误的唯一键,结果行中的数据被来自不同行的数据替换.

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

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

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

《c# – EntityFramework从SQL Server View返回损坏/交换的数据》

点赞