Как DbContext работает с несколькими пользовательскими сеансами в C#

#c# #entity-framework

#c# #entity-framework

Вопрос:

У меня есть проект веб-приложения MVC плюс проект библиотеки классов. Теперь я пытаюсь реализовать транзакции Entity Framework. Итак, для этого я решил использовать одноэлементный шаблон, в котором я могу использовать один объект DbContext, доступный на протяжении всей транзакции. Но позже я обнаружил, что шаблон Factory amp; UoW более подходит, чем Singleton. Но у меня есть несколько вопросов, и я еще не нашел ответов в Интернете.

  1. Когда у нас есть один DbContext для всего проекта с использованием шаблона Factory amp; UoW, что произойдет, если более 1 пользователя попытаются выполнить одну и ту же операцию. Будут ли они работать с одним и тем же DbContext или каждому пользователю будет предоставлен уникальный DbContext для работы в их транзакции??

  2. Если количество пользователей работает с одним и тем же DbContext в количестве транзакций, как управлять параллелизмом??

    Было бы очень здорово, если бы вы помогли мне ответить на мой вопрос.

Комментарии:

1. Вам не нужны явные транзакции, SaveChanges используется внутренняя транзакция. Они понадобятся вам только в том случае, если вы будете следовать плохой практике сохранения каждого изменения в базе данных, что является полной противоположностью UoW. DbContext должен быть недолговечным. Используемый таким образом, это контейнер UoW — все изменения сохраняются в памяти до тех пор, пока вы не вызовете SaveChanges() в конце запроса. Никаких явных транзакций не требуется. DbContext никогда не следует использовать в качестве синглтона в веб-приложении

2. Все ASP.NET Учебные пособия по MVC показывают DbContext, который создается и удаляется в самом действии контроллера или вводится в качестве зависимости конструктору с временным временем жизни или областью действия. В обоих случаях конструктор живет только до тех пор, пока запрос, как и DbContext.

3. Хорошо, в настоящее время у меня есть using оператор, который инициализирует новый DbContext в каждом методе, который выполняет любые операции CRUD. Если я удалю using инструкции и удалю методы SaveChanges() then, которые работают на основе предыдущих сохраненных записей, не могут быть распознаны, пока я не выполню окончательную фиксацию, потому что изменения еще не сохранены в БД. Как убедиться, что НЕ зафиксированные изменения отслеживаются внутри транзакции.

4. Не удаляйте using , не удаляйте SaveChanges . DbContext предназначен для работы таким образом. Когда вы используете его таким образом, нет причин использовать явные транзакции, потому SaveChanges() что сам использует транзакцию внутри

5. Но мне нужно обернуть количество SaveChanges() в одну транзакцию. Как этого добиться??

Ответ №1:

  1. Вам не нужен один объект DbContext, по замыслу он должен создаваться с каждым запросом.

  2. Для удаления объекта выберите использование блока или, если вы используете внедрение зависимостей, оно будет разрешено с помощью контейнеров dependency injection / IoC.

  3. О параллелизме Параллелизм в Entity Framework:

Entity Framework по умолчанию поддерживает оптимистичный параллелизм. EF сохраняет данные объекта в базе данных, предполагая, что те же данные не были изменены с момента загрузки объекта. Если он обнаруживает, что данные изменились, возникает исключение, и вы должны разрешить конфликт, прежде чем пытаться сохранить его снова.