[英]How to retrieve data from a ComplexType Sql Server stored procedure inside C# project built with EntityFramework
[英]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.