Entity Framework - Свойства объекта - PullRequest
2 голосов
/ 18 марта 2011

Я пытаюсь использовать Entity Framework для своей модели / доступа к данным, и сталкиваюсь с проблемами скорости, надеюсь, кто-то может помочь?

Я использовал диаграмму EF с генератором кода по умолчанию для генерации частичных классов, описывающих все, что будет сохраняться. Затем у меня есть частичные классы с методами и непостоянными свойствами. Это могут быть простые вещи, такие как полное имя как объединенные имена / фамилии или производные от связанных сущностей, такие как общий запас как сумма сбора количества местоположений запасов.

Любые методы доступа к связанным сущностям работают, но кажутся очень медленными. Вот пример особенно медленного, он занимает около 6-7 секунд:

Краткое описание вовлеченных лиц:

поставщик -> поставляет много строк поставщика, каждая имеет себестоимость SupplierLine -> разбитый на СтокЛайнс StockLine -> имеет много локаций, каждая локация имеет количество

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

Я сделал это в качестве функции в Поставщике как:

Public Function StockValue() As Decimal
        Return SupplierLines.
            Sum(Function(sul) sul.LastPrice * sul.StockLines.Sum(Function(skl) skl.Locations.Sum(Function(l) l.Quantity)))
    End Function

Что дает правильные результаты, но на это уходит вечность.

Есть мысли о том, как мне добиться лучших результатов?

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

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Я нашел метод Include () ..., который расширяет IEnumerable, и использую его.Это решает проблемы производительности, сохраняя при этом незнание контекста.

1 голос
/ 18 марта 2011

Ваша проблема, скорее всего, ленивая загрузка.Если вы загружаете только Supplier сущность, она не загружает свои действительные SupplierLine экземпляры, и они связывают StockLine экземпляры и связанные с ними Location экземпляры.Если это действительно так (если вы не Include их в запросе извлекаете Supplier), ситуация выглядит следующим образом:

  1. SupplierLines. - выполняет запрос к базе данных, чтобы получить все строки длятекущий Поставщик
  2. sul.StockLines. - выполняет отдельный запрос для каждой строки поставщика, чтобы получить его строки запаса
  3. skl.Locations. - выполняет отдельный запрос для каждого складская линия для определения местоположения

Таким образом, в зависимости от количества данных, которые у вас есть в этих коллекциях, вы можете получить от десятков до тысяч запросов sql, выполненных при первом вызове StockValue.Следующий вызов будет быстрым, потому что данные уже загружены.

Если вы хотите избежать этого, вы должны получить поставщика со всеми его реальными данными:

context.Supplier.Include("SupplierLines.StockLines.Locations").Where(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...