У меня есть одинаковые DbContext
в ClassA
и ClassB
?Это гарантировано?
Контекст базы данных зарегистрирован как зависимые области, это означает, что экземпляр используется совместно при обработке одного входящего запроса.Каждый запрос получит свою собственную область внедрения зависимостей, поэтому в одном запросе вы гарантированно получите такой же экземпляр контекста базы данных.
С другой стороны, вы также гарантированно получитеотдельные контексты базы данных для отдельных запросов.
Если и ClassA
, и ClassB
имеют одинаковый DbContext
, то SaveChanges
в ClassB
повлияет на EntityX
, добавленный в ClassA
?
Краткий ответ: да.Поскольку это единый контекст базы данных, существует также одна совокупность отслеживаемых объектов.Поэтому, если вы сначала запустили ClassA.Method1
и у вас там не было вызова SaveChanges
, а затем запустили ClassB.Method2
, SaveChanges()
в последнем также сохранит изменения из первого метода.
Хотяэто может показаться проблематичным, на практике это обычно не так: запрос обычно обрабатывается как часть действия контроллера, поэтому существует очень четкий поток управления.Таким образом, параллельной обработки не существует, и до тех пор, пока вы всегда «очищаете» контекст после его использования (например, вызывая SaveChanges()
), проблем не будет.
С другой сторонывы также можете использовать это в своих интересах и обмениваться транзакциями в процессе обработки вашего запроса, при этом ваши методы не будут знать, что они являются частью транзакции.
Что я должен сделать, чтобы изолировать изменения в ClassA
и ClassB
?
Подумайте, действительно ли вам нужна изоляция.Единственный способ, которым ваш Method2
может повлиять на Method1
, - это когда Method1
внес изменения в объекты, которые не были сохранены.И если вы делаете это, то, скорее всего, вы все равно злоупотребляете своими сущностями.Обычно метод должен завершать свою работу с сущностями, не оставляя грязного состояния позади.