Невероятный дубликат в Entity Framework Query - PullRequest
15 голосов
/ 14 февраля 2011

Мой запрос SQL к определенному представлению возвращает мне 3 разные строки.

 select * from vwSummary
 where vidate >= '10-15-2010' and vidate <= '10-15-2010'
 and idno = '0330'
 order by viDate

Но если я выполню один и тот же запрос через мою структуру сущностей, я получу 3 строки, но все 3 строки одинаковы, эквивалентныв третью строку.

        firstVisibleDate = new DateTime(2010, 10, 15);

        lastVisibleDate = new DateTime(2010, 10, 15);

var p1 = (from v in db.vwSummary
                     where v.viDate >= firstVisibleDate && v.viDate <= lastVisibleDate
                     && v.IDNo == "0330"
                          select v).ToList();

Может кто-нибудь помочь мне решить эту проблему.

РЕДАКТИРОВАТЬ: Я изменил свой запрос, как это, и он работает.Но все же я хочу вернуться к тому, что показано выше, поскольку мне нужно повторить итерацию для дальнейшей обработки.

List<objectName> p1 = (from v in db.vwSummary
                     where v.viDate >= firstVisibleDate && v.viDate <= lastVisibleDate
                     && v.IDNo == "0330"
                          select new <ObjectName>
{
a = v.a
b = v.b
}
).ToList<ObjectName>();

Ответы [ 5 ]

20 голосов
/ 20 июля 2012

У меня была похожая проблема, и я решил ее, изменив опцию слияния ObjectSet.Пример:

    using (TargetDBDataContext db = new TargetDBDataContext())
    {
        db.SomeView.MergeOption = System.Data.Objects.MergeOption.NoTracking;
        return db. SomeView.ToList();
    }

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

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

Entity Framework предоставляет ряд параметров настройки производительности, которые помогут вам оптимизировать производительность ваших приложений.Одним из таких параметров настройки является .AsNoTracking ().Эта оптимизация позволяет вам сказать Entity Framework, что он не отслеживает результаты запроса.Это означает, что Entity Framework не выполняет никакой дополнительной обработки или хранения объектов, возвращаемых запросом.Однако это также означает, что вы не можете обновить эти объекты, не подключая их к графику отслеживания.

Вы можете установить параметр AsNoTracking непосредственно в своем представлении, чтобы решить эту проблему.

context.viewname. AsNoTracking () .Where (x => x.ColumnName! = Null);

2 голосов
/ 15 марта 2016

Установить ключ объекта в модели объекта представления. Это сработало для меня в двух отдельных случаях. Вы можете использовать одно или несколько свойств в ключе.

0 голосов
/ 16 августа 2013

Я только что столкнулся с этой проблемой и думал, что это моя реализация, пока не нашел этот пост. Единственный обходной путь, который мне удалось получить, - это запустить sqlquery следующим образом: -

using(var db = new Tpr.Models.MyContext())
{
    var model = _uow._context.Database.SqlQuery<MyTable>(string.Format("select * from MyTable where ID = '{0}'", "12345678"));

    Assert.IsNotNull(model);
}
0 голосов
/ 14 февраля 2011

ВОЗМОЖНОЕ РЕШЕНИЕ : я изменил свой запрос следующим образом, и он работает.Но все же я хочу вернуться к тому, что показано выше, поскольку мне нужно повторить итерацию для дополнительной обработки.

List<objectName> p1 = (from v in db.vwSummary
                     where v.viDate >= firstVisibleDate && v.viDate <= lastVisibleDate
                     && v.IDNo == "0330"
                          select new <ObjectName>
{
a = v.a
b = v.b
}
).ToList<ObjectName>();

Я нашел источник проблемы из здесь и здесь .Я догадался, что это должно быть проблемой, поскольку у меня не было очень хорошего ключа, по моему мнению, поскольку это был скорее сводный отчет.Поэтому я придерживаюсь обходного пути, который нашел в другом ответе.

Поэтому, если вы обнаружите похожую проблему, проблема заключается в добавлении правильного первичного ключа к вашей таблице или представлению.Если вы не можете добавить один, попробуйте что-то похожее на обходной путь.

...