代码之家  ›  专栏  ›  技术社区  ›  Tony Smith

ASP MVC Linq to SqlTransaction回滚

  •  0
  • Tony Smith  · 技术社区  · 15 年前

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   Nicholas Murray    15 年前

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

    如果要使用Visual Studios DBML设计器,可以执行以下步骤

    首先将相关联的表拖到设计器上,然后通过向用户类添加一个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