2010-04-12 54 views
0

我知道LINQ to SQL會自動包裝數據庫事務中的所有更改。所以如果我想用另一個插入的返回ID(我的用戶表有一個AddressID,所以我添加一個新的地址記錄,然後添加一個帶有該ID的新用戶記錄),並且在插入用戶時出現問題,地址插入不會回滾。你是否應該在另一個事務中包含SubmitChanges?ASP MVC LINQ to SQLtransaction回滾

回答

0

如果您的表具有外鍵關係,LINQ to SQL將爲您處理此問題。

如果您想使用視覺工作室DBML設計師,你可以按照下面

一拖步關聯的表到你的設計師和一個一對多realtionship將通過添加UserAddress集合屬性的建立到用戶類。

這將允許您創建一個UserAddress對象,並把它添加到您的用戶對象,然後保存用戶對象,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的刪節版本中,您可以看到對錶的兩個更新都包含在一個事務中,因此如果在執行期間遇到任何故障(如果遇到任何故障)你的數據庫深入查看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的東西!非常感謝你。 – 2010-04-13 19:41:14