Entity Framework. Просмотреть возвращенные дубликаты записей - PullRequest
42 голосов
/ 20 октября 2010

Я использую Entity Framework, который содержит представление.И у меня есть запрос:

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

Этот запрос возвращает набор объектов, но 1-й объект равен 5-му.

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

Я беру sql-скрипт для этого запроса из sql tracer и запускаю его в SQL Management Studio, он возвращает разные записи.

Ответы [ 5 ]

80 голосов
/ 28 сентября 2012

Согласно @ Giovane Ответчик

У нас была такая же проблема в нашей системе с Entity Framework, имеющей дело с представлениями.Попробуйте использовать ROW_NUMBER () OVER () SQL для создания столбца с уникальными значениями, но он не работает.

Я сделал то же самое, но чтобы он работал, мне нужно открыть модель EDMXи затем выберите этот столбец как ключ сущности.

enter image description here

Тогда он будет работать

Есть очень хорошая статья на эту тему

Дубликаты записей

Наиболее важная строка статей:

При включении представления в вашу Entity Model моделькажется, просто использовать первые столбцы без значения NULL в качестве первичного ключа (поскольку все столбцы, используемые в первичном ключе, не должны иметь значения NULL).

48 голосов
/ 10 сентября 2014

Вам нужно всего лишь сделать: context.viewname.AsNoTracking().Where(x => x.ColumnName != null);

12 голосов
/ 18 ноября 2011

У нас была такая же проблема в нашей системе, когда Entity Framework работал с представлениями.Попробуйте использовать ROW_NUMBER () OVER () SQL для создания столбца с уникальными значениями, но он не работает.

Нам нужно вставить поле more, FK для другой таблицы в представлении, чтобы оно моглодобавить в качестве дополнительного обучения для mebro EntityKeyMembers Elimite и, таким образом, проблему повторения.

Таким образом, если проблема сохраняется в такой ситуации, решение состоит в том, чтобы вставить столбец FK, чтобы он был ЧЛЕНОМ полейкоторые формируют EntityKey таблицы.

2 голосов
/ 29 апреля 2013

В представлении попробуйте преобразовать первую запись в ненулевое значение, например:

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

Указывает Entity Framework, что он может быть первичным ключом автоматически.

1 голос
/ 12 августа 2014

Если вы не хотите обновлять edmx и устанавливать какой-либо ключ на столбец &&

, если вы не хотите обновлять запись просмотра (только для получения записи), используйте приведенный ниже код, который работает для меня.

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

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