Является ли DbContext дорогостоящей операцией?

В С# MVC EF framework я видел множество примеров, которые просто создают новый DbContext всякий раз, когда требуется вставка или запрос, а затем закрывать/отпускать (многие используют "использование" для автоматического закрытия/выпуска).

Был ли поиск по этому вопросу, но не нашел хорошего ответа, но создает DbContext очень дешевую и быструю операцию?

Например, думая о типичном приложении MVC, на странице есть много "компонентов", таких как заголовки, палитры, основной контент и т.д., а в нетривиальной настройке каждый компонент будет иметь свои собственные индивидуальная логика и код. Должен ли я создать новый DbContext в каждом из этих компонентов? (если да, будет ли система автоматически кэшировать результат запроса? - например, общий пример использования заключается в том, что в каждом из этих компонентов ему необходимо запросить базу данных для текущих настроек сайта, которая является той же строкой в таблицу).

Ответ 1

Как отмечено в разделе "" Рекомендации по производительности для Entity Framework 4, 5 и 6" в разделе 9.3 (основное внимание):

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

Ответ 2

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

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

Я также предлагаю использовать что-то вроде Glimpse, которое позволяет вам видеть все запросы и соединения, которые использовались для отображения страницы, включая запросы ajax, и дает вам отличный обзор того, что происходит. Иногда может быть немного страшно!