繁体   English   中英

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

[英]EntityFramework returns corrupted/swaped data from 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; }
}

在此输入图像描述

UPDATE

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

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

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

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

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

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM