实体框架。查看返回重复记录

时间:2010-10-20 12:45:55

标签: entity-framework duplicates

我使用包含视图的Entity Framework。我有疑问:

var data = this.context.vwRevenues
    .Where(x => x.revenue >= 0);
    .OrderByDescending(x => x.year)
    .ThenByDescending(x => x.month)
    .Take(10)
    .ToList();

此查询返回实体集,但第一个实体等于第5个。

data[0] == data[4] // true

我从sql tracer获取此查询的sql脚本并将其运行到SQL Management Studio中, 它返回不同的记录。

5 个答案:

答案 0 :(得分:79)

根据 @Giovane 答案

我们的系统中存在同样的问题,实体框架处理视图。尝试使用ROW_NUMBER()OVER()SQL创建一个具有唯一值的列,但不起作用。

我做了同样的事情,但要使其工作,我需要打开EDMX模型,然后选择此列作为实体密钥。

enter image description here

然后它会起作用

关于这个

有一篇非常好的文章

Duplicate Records

文章最重要的一行是:

在实体模型中包含视图时,模型似乎只是使用第一个不可为空的列作为主键(因为主键中使用的所有列都应该是不可为空的)。 / EM>

答案 1 :(得分:44)

您只需:context.viewname.AsNoTracking().Where(x => x.ColumnName != null);

答案 2 :(得分:12)

我们的系统中存在同样的问题,实体框架处理视图。尝试使用ROW_NUMBER()OVER()SQL创建一个具有唯一值的列,但不起作用。

我们需要在视图中为另一个表插入一个更多的字段,一个FK,以便它可以作为mebro EntityKeyMembers Elimite的附加培训添加,以及重复的问题。

因此,如果问题在这种情况下仍然存在,解决方案是为它插入一个FK列,使其成为构成表的EntityKey的字段的成员。

答案 3 :(得分:2)

在视图中尝试将第一个记录转换为非空值,如下所示:

isnull(ROW_NUMBER() OVER (ORDER BY "Column"), 0) AS Row

它向实体框架指示可以自动成为主键。

答案 4 :(得分:1)

如果您不想更新edmx并将任何键设置为列&&

如果您不想更新查看记录(仅用于获取记录),请使用以下代码为我工作。

context.viewname.MergeOption = System.Data.Objects.MergeOption.NoTracking;

context.viewname.Where(x => x.columnname != null);