2010-04-04 2 views
7

Там был много вопроса об управлении EntityContext жизнью,Управление EntityConnection срока службы

например Instantiating a context in LINQ to Entities

Я пришел к выводу, что контекст сущности следует считать единицей работы и, следовательно, не использоваться повторно. Отлично.

Но при этом некоторые исследования для ускорения моего доступа к базе данных, я побежал в этом блоге ...

Improving Entity Framework Performance

Пост утверждает, что ЭФ низкая производительность по сравнению с другими системами, часто из-за EntityConnection объект создается каждый раз, когда требуется новый объект EntityContext.

Чтобы проверить это, я вручную создал статическое EntityConnection в Global.asax.cs Application_Start().

конвертировал весь мой контекст с помощью заявления

using(MyObjContext currContext = new MyObjeContext(globalStaticEFConnection) 
{ 
    .... 
} 

Это, кажется, ускорили вещи немного без каких-либо ошибок, до сих пор, насколько я могу судить.

Но разве это безопасно?

Используется ли в масштабе применения по месту применения EntityConnection ввести условия гонки?

С наилучшими пожеланиями, Kervin

+0

Это, вероятно, начнется священная война. ;) – Nix

ответ

7

EntityConnection is documented to be not thread-safe. Я думаю, вы могли бы объединить их, но вы не можете использовать одно статическое соединение для веб-приложения, так как будет задействовано много потоков.

+0

Спасибо. Я был уверен, что это было бы не так просто, но я в значительной степени пытаюсь понять, есть ли у кого-то соединение для производительности. Поскольку это сообщение в блоге MSDN сделало для этого вполне подходящее дело. – kervin

+0

Я ничего не изменил бы без повторного тестирования в .NET 4. Возможно, это уже было рассмотрено. –

2
  • Если контекст EF является применение в масштабах, считают, что пользователь А сделал изменения (не совершенные) & пользователь B совершило свои изменения, все изменения будут получать приверженные база данных, так как оба пользователя A & B используют один и тот же экземпляр

  • В моем проекте я сделал для каждого запроса WebRequest контекст EF - т.е. объект контекста является статическим от начала до конца веб-запроса &, все операции в этом запросе работают с одним и тем же контекстом EF. Это значительно ускорило мою обработку без проблемы, упомянутой выше.

Один из способов реализации этого - использовать контейнер DI (я использую Unity) для управления временем жизни контекста EF. Менеджер ресурса на каждый веб-запрос не предоставляется из коробки в Unity, но есть множество статей, которые показывают, как это можно сделать.

HTH.

+1

Привет, спасибо, но мой EntityContext не является прикладным. Используется EntityConnection. Я использую EntityContext как «единицу работы», т.е. новый контекст с каждым доступом в основном. – kervin

Смежные вопросы