【问题标题】:Entity Framework. View return duplicate records实体框架。查看退货重复记录
【发布时间】:2010-10-20 12:45:55
【问题描述】:

我使用包含视图的实体框架。我有疑问:

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 中, 它返回不同的记录。

【问题讨论】:

标签: entity-framework duplicates


【解决方案1】:

根据 @Giovane 的回答

我们在系统中遇到了同样的问题,即 Entity Framework 处理视图。尝试使用 ROW_NUMBER () OVER () SQL 创建具有唯一值的列​​,但没有奏效。

我做了同样的事情,但要使其正常工作,我需要打开 EDMX 模型,然后选择此列作为 Entity Key。

然后就可以了

这方面有一篇很好的文章

Duplicate Records

文章最重要的一行是:

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

【讨论】:

  • “第一个不可为空的列”是什么意思?具体有多少?当然不是全部,否则我不会在没有任何不可空列的视图中偶然发现这个问题。
  • 这是一个鬼鬼祟祟的小功能...感谢您的出色修复!
  • 我刚遇到这个问题,BOOM!谢谢!你会认为 EF 现在会预测到这一点
  • @jDave1984 在新的 EF6 中,我认为我们根本无法添加具有不可为空列的视图。
  • “重复记录”指向的链接已损坏。
【解决方案2】:

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

【讨论】:

  • 非常感谢 AsNoTracking() 提示,添加比修改我们的实体以获得另一个 ROW 键要容易得多:)
  • 这对我有用。 (并且没有删除 EDMX 更新所做的一些记录。)
  • OMG - 扯掉我的头发(比喻)
  • 添加 AsNoTracking 删除了 EF 中的重复项,还没有看到它的任何副作用。
  • 我希望这个线程仍然活跃。 EntityFramework 4.1 有解决方案吗?似乎 4.1 版没有 AsNoTracking 查询的选项。 4.1有等效的解决方案吗?
【解决方案3】:

我们的系统中遇到了同样的问题,即 Entity Framework 处理视图。尝试使用 ROW_NUMBER() OVER() SQL 创建具有唯一值的列​​,但没有奏效。

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

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

【讨论】:

  • 阅读@Juan Carlos Sánchez Robles 的回答。 ROW_NUMBER 是一个很好的方法,但用 ISNULL 函数包装它
【解决方案4】:

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

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

向Entity Framework表明可以自动成为主键。

【讨论】:

    【解决方案5】:

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

    如果您不想更新视图记录(仅用于获取记录),请使用下面的代码,它对我有用。

    context.viewname.MergeOption = System.Data.Objects.MergeOption.NoTracking;
    
    context.viewname.Where(x => x.columnname != null);
    

    【讨论】:

    • 希望不必更改 edmx,但遗憾的是这对我不起作用
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2014-07-02
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    相关资源
    最近更新 更多