Первое существенное правило EF - ObjectContext
- это единица работы, и поэтому вам приходится иметь дело с этим таким образом. Если вы делитесь контекстом между пользователями, вы сделали такую большую ошибку, что вам следует немедленно отключить приложение и не позволять пользователям использовать его, пока вы не исправите его. Я написал ответ , где я описал два шаблона, которые реализует контекст - единица работы и карта идентичности. Если вы разделяете контекст между параллельными пользователями, вы делаете результат каждой операции неопределенным. Вы не можете сказать, есть ли у пользователя свежие / подтвержденные данные, и вы не можете сказать, сохранили ли вы все, что пользователь изменил в одной транзакции.
Теперь контекст использует транзакцию внутренне. Каждый SaveChanges
сохраняет каждую измененную запись (от всех одновременных пользователей, если вы разделяете контекст) в транзакции. Одиночная ошибка и вся транзакция откатывается. Как только вы начинаете использовать контекст для логической операции (запрос или действие в случае веб-приложения), вы можете показать пользователю данные и позволить ему внести изменения, или вы можете просто попробовать их снова (в случае решения проблем блокировки). Это, конечно, не решает проблем, когда вы не проверяете пользовательский ввод, потому что это ошибка в приложении, которая должна быть исправлена. Если у вас нет подтверждения, вы не сможете показать пользователю, что не так с данными.