У меня есть таблица User
и таблица ClubMember
в моей базе данных. Между пользователями и членами клуба существует однозначное сопоставление, поэтому каждый раз, когда я вставляю ClubMember
, мне нужно сначала вставить User
. Это реализовано с помощью внешнего ключа на ClubMember
(UserId REFERENCES User (Id)
).
В моем приложении ASP.NET MVC я использую LinqToSql и шаблон репозитория для обработки логики сохраняемости. Как я это реализовал в настоящее время, мои транзакции User
и ClubMember
обрабатываются отдельными классами репозитория, каждый из которых использует свой собственный экземпляр DataContext
.
Это прекрасно работает, если нет ошибок базы данных, но я обеспокоен тем, что у меня останутся потерянные записи User
, если какие-либо вставки ClubMember
завершатся неудачно.
Чтобы решить эту проблему, я рассматриваю возможность перехода на один DataContext
, который я мог бы загрузить с помощью обеих вставок, а затем вызвать DataContext.SubmitChanges()
только один раз. Однако проблема заключается в том, что Id
для User
не назначается до тех пор, пока User
не будет вставлено в базу данных, и я не могу вставить ClubMember
, пока не узнаю UserId
.
Вопросы:
Можно ли вставить
User
в базу данных, получитьId
, затем вставитьClubMember
, все как одну транзакцию (которую можно откатить, если что-то пойдет не так с какой-либо частью транзакции)? Если да, то как?Если нет, могу ли я только вручную удалить все созданные потерянные записи
User
? Или есть лучший способ?