ASP MVC LINQ to SQLtransaction откат - PullRequest
0 голосов
/ 13 апреля 2010

Я знаю, что LINQ to SQL автоматически переносит все изменения в транзакции базы данных. Поэтому, если я хотел использовать возвращенный идентификатор для другой вставки (моя таблица пользователей имеет адрес ID, поэтому я добавляю новую запись адреса, а затем добавляю новую запись пользователя с этим идентификатором), и возникла проблема при вставке пользователя, вставка адреса не откатился бы. Стоит ли обернуть оба SubmitChanges в другую транзакцию?

1 Ответ

0 голосов
/ 13 апреля 2010

LINQ to SQL будет обрабатывать это для вас, если ваши таблицы имеют отношение внешнего ключа.

Если вы хотите использовать дизайнер Visual Studio Studios, вы можете выполнить следующие шаги

Сначала перетащите связанные таблицы в свой конструктор, и установление отношений «один ко многим» будет установлено путем добавления свойства коллекции UserAddress к классу User.

Это позволит вам создать объект UserAddress и добавить его в ваш объект User, затем сохранить объект User, LINQ to SQL будет затем обрабатывать поиск и вставку необходимых первичных ключей как часть транзакции

User user = new User();
user.FirstName = "Foo";
user.LastName = "Bar";

UserAddress userAddress = new UserAddress();
userAddress.Line1 = "22";
userAddress.Line2 = "Acacia Ave";
userAddress.Postcode = "E13 9AZ";

user.UserAddresses.Add(userAddress);
db.Users.InsertOnSubmit(user);
db.SubmitChanges();

В сокращенной версии sql, созданной во время отправки изменений, вы можете видеть, что оба обновления таблиц содержатся в одной транзакции и поэтому будут откатываться, если во время выполнения возникнет ошибка (вы можете запустить профилировщик для своего дБ для более глубокого просмотра sql выполнено).

BEGIN TRANSACTION 
INSERT INTO [dbo].[UserAddresses]([UserID], [Line1], [Line2], [Postcode]) VALUES (@p0, @p1, @p2, @p3)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
exec sp_executesql N'INSERT INTO [dbo].[UserAddresses]([UserID], [Line1], [Line2], [Postcode]) VALUES (@p0, @p1, @p2, @p3)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]',N'@p0 int,@p1 nchar(10),@p2 nchar(10),@p3 nchar(10)',@p0=3,@p1=N'22        ',@p2=N'Acacia Ave',@p3=N'E13 9AZ   '
INSERT INTO [dbo].[Users]([FirstName], [LastName]) VALUES (@p0, @p1)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
exec sp_executesql N'INSERT INTO [dbo].[Users]([FirstName], [LastName]) VALUES (@p0, @p1)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]',N'@p0 nchar(10),@p1 nchar(10)', @p0=N'Foo       ',@p1=N'Bar     
COMMIT TRANSACTION 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...