Linq to sql ASP MVC LINQ到SQLtransaction回滚

Linq to sql ASP MVC LINQ到SQLtransaction回滚,linq-to-sql,transactions,Linq To Sql,Transactions,我知道LINQtoSQL会自动包装数据库事务中的所有更改。因此,如果我想将返回的ID用于另一个插入(我的用户表有一个AddressID,因此我添加了一个新的地址记录,然后添加了一个具有该ID的新用户记录),并且插入用户时出现问题,那么地址插入将不会回滚。是否应该在另一个事务中包装这两个提交更改?如果表具有外键关系,LINQ to SQL将为您处理此问题 如果希望使用Visual Studio dbml designer,可以执行以下步骤 首先将相关联的表拖到设计器中,通过向用户类添加UserAd

我知道LINQtoSQL会自动包装数据库事务中的所有更改。因此,如果我想将返回的ID用于另一个插入(我的用户表有一个AddressID,因此我添加了一个新的地址记录,然后添加了一个具有该ID的新用户记录),并且插入用户时出现问题,那么地址插入将不会回滚。是否应该在另一个事务中包装这两个提交更改?

如果表具有外键关系,LINQ to SQL将为您处理此问题

如果希望使用Visual Studio dbml designer,可以执行以下步骤

首先将相关联的表拖到设计器中,通过向用户类添加UserAddress集合属性,将建立一对多的关系

这将允许您创建一个UserAddress对象并将其添加到用户对象中,然后保存用户对象,然后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