Были многие вопрос на управлении временем жизни EntityContext,
например, Инстанцирование контекста в LINQ к Объектам
Я пришел к выводу, что контекст объекта нужно считать единицей работы и поэтому не снова использовать.Отлично.
Но при проведении некоторого исследования для ускорения моего доступа к базе данных, я столкнулся с этим сообщением в блоге...
Улучшение производительности платформы объекта
Сообщение утверждает, что низкая производительность EFs по сравнению с другими платформами часто происходит из-за объекта EntityConnection, создаваемого каждый раз, когда новый объект EntityContext необходим.
Для тестирования этого, я вручную создал статический EntityConnection в Global.asax.cs Application_Start ().
Я затем преобразовал все свои операторы использования контекста в
using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
....
}
Это, кажется, ускорило вещи немного без любых ошибок, насколько далеко, как я могу сказать.
Но действительно ли это безопасно?
Использование applicationwide статического EntityConnection представляют условия состязания?
С наилучшими пожеланиями, Kervin
EntityConnection не является потокобезопасным . Я думаю, вы можете объединить их, но вы не можете использовать одно статическое соединение для веб-приложения, так как будет задействовано много потоков.
Если ваш контекст EF относится к приложению, учтите, что пользователь A внес изменения (не зафиксировал), а пользователь B - зафиксировал свои изменения, все изменения будут зафиксированы в базе данных, так как оба пользователя A и B используют один и тот же экземпляр
В моем проекте я выполнял обработку каждого WebRequest контекста EF, т.е. объект контекста статичен от начала до конца веб-запроса, и все операции в этом запросе работают с одним и тем же контекстом EF. Это значительно ускорило мою обработку без упомянутой выше проблемы.
Один из способов реализовать это - использовать контейнер DI (я использую Unity) для управления временем жизни контекста EF. Менеджер времени жизни для каждого веб-запроса не предоставляется в Unity по умолчанию, но есть масса статей, которые показывают, как это можно сделать.
HTH.