Невероятный дубликат в запросе Entity Framework

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

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

Но если я запускаю один и тот же запрос через мою инфраструктуру сущности, я получаю 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();

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

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

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>();

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Я только что испытал эту проблему и подумал, что это была моя реализация, пока я не нашел этот пост. Единственным обходным решением, с которым мне удалось работать, было запустить 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);
}