2010-04-12 3 views
0

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

ответ

0

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

Если вы хотите использовать Визуальный Studios DBML дизайнер вы можете следовать приведенным ниже

Первых перетащить соответствующие таблицы на ваш дизайнер и realtionship один-ко-многим будет создан путем добавления свойства коллекции UserAddress к классу User.

Это позволит создать объект UserAddress и добавить его к объекту пользователя, затем сохранить объект User, LINQ к 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, созданной во время отправки изменений, вы можете видеть, что оба обновления таблиц содержатся в одной транзакции и поэтому будут откатны, если во время выполнения обнаружен какой-либо сбой (вы можете запустить профайлер против ваш db для глубокого просмотра 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 
+0

Чувак. Это замечательно. Я обожаю меня этим материалом ORM! Большое вам спасибо. –

Смежные вопросы