Entity Framework 6: отложенная загрузка не работает - PullRequest
0 голосов
/ 12 ноября 2018

Свойство определяется как virtual. Но прежде чем я получу доступ к свойству заказа, данные объекта заказа были загружены, почему?

debug screenshots

Полный исходный код:

full source code

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

извините, похоже на проблему visual studio все еще будет казнен.

Visual Studio Debug автоматически выполняет Expression

комментарий к заявлению

sql profiler

включает заявление

sql profiler

0 голосов
/ 12 ноября 2018

Пара вещей:

Когда вы заявляете: не работает, вы получаете ордер обратно, но цифра в $ равна 0,0, когда вы ожидаете другое значение? Похоже, у вас есть записи порядка 2х, но исходя из того, что возвращается, вы ожидаете ненулевое число, обе записи ненулевые? В представлении отладки разверните «Заказы» во всплывающем контекстном меню, это покажет, какие сведения о заказах загружены EF.

Во-первых, вы должны быть осторожны при использовании методов "OrDefault". Ваш код предполагает, что значение возвращается. В этих случаях лучше использовать Single() или First() в зависимости от ситуации.

Кроме того, при использовании First вы должны указать условие OrderBy, чтобы обеспечить надежный порядок.

SaveChanges Должен вызываться только при изменении данных.

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

1018 * Т.е. *

using (var context = new EfContext())
{
  var customer = context.Customers
    .Include(c => c.Orders)
    .Single(c => c.CustomerId = customerId);
  // Do stuff...
}

Если вы хотите только 1 применимый заказ для данного сотрудника, рассмотрите возможность использования Select для его получения:

1024 * Т.е. *

using (var context = new EfContext())
{
  var data = context.Customers.Where(c => c.CustomerId = customerId)
    .Select(c => new { Customer = c, FirstOrder = c.Orders.OrderBy(o => o.OrderDate).FirstOrDefault()})
    .Single();
  // Do Stuff...
}

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

Лучше всего просто использовать Select, чтобы получить нужные поля от клиента и заказа (ов). Это уменьшает объем данных (строк и столбцов), извлекаемых из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...