#c# #entity-framework
#c# #entity-framework
Вопрос:
У меня есть проект веб-приложения MVC плюс проект библиотеки классов. Теперь я пытаюсь реализовать транзакции Entity Framework. Итак, для этого я решил использовать одноэлементный шаблон, в котором я могу использовать один объект DbContext, доступный на протяжении всей транзакции. Но позже я обнаружил, что шаблон Factory amp; UoW более подходит, чем Singleton. Но у меня есть несколько вопросов, и я еще не нашел ответов в Интернете.
-
Когда у нас есть один DbContext для всего проекта с использованием шаблона Factory amp; UoW, что произойдет, если более 1 пользователя попытаются выполнить одну и ту же операцию. Будут ли они работать с одним и тем же DbContext или каждому пользователю будет предоставлен уникальный DbContext для работы в их транзакции??
-
Если количество пользователей работает с одним и тем же 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:
-
Вам не нужен один объект DbContext, по замыслу он должен создаваться с каждым запросом.
-
Для удаления объекта выберите использование блока или, если вы используете внедрение зависимостей, оно будет разрешено с помощью контейнеров dependency injection / IoC.
-
О параллелизме Параллелизм в Entity Framework:
Entity Framework по умолчанию поддерживает оптимистичный параллелизм. EF сохраняет данные объекта в базе данных, предполагая, что те же данные не были изменены с момента загрузки объекта. Если он обнаруживает, что данные изменились, возникает исключение, и вы должны разрешить конфликт, прежде чем пытаться сохранить его снова.