如何:将更改提交到数据库

无论您对对象做了多少项更改,都只是在更改内存中的副本。 您并未对数据库中的实际数据做任何更改。 直到您对 SubmitChanges 显式调用 DataContext,您所做的更改才会传输到服务器。

当您进行此调用时,DataContext 会设法将您所做的更改转换为等效的 SQL 命令。 你可以使用自己的自定义逻辑来替代这些操作,但提交顺序是由 DataContext 的一项称作“更改处理器”的服务来协调的。 事件的顺序如下:

  1. 调用 SubmitChanges 时,LINQ to SQL 会检查已知对象的集合,以确定是否已向其附加新实例。 如果已附加,这些新实例将添加到被跟踪对象的集合。

  2. 所有具有挂起更改的对象将按照它们之间的依赖关系排序成一个对象序列。 如果一个对象的更改依赖于其他对象,则这个对象将排在其依赖项之后。

  3. 在传输任何实际更改之前,LINQ to SQL 会启动一个事务来封装由单个命令组成的系列。

  4. 对对象的更改会逐个转换为 SQL 命令,然后发送到服务器。

此时,如果数据库检测到任何错误,都会造成提交进程停止并引发异常。 将回滚对数据库的所有更改,就像未进行过提交一样。 DataContext 仍具有所有更改的完整记录。 因此你可以设法修正问题并重新调用 SubmitChanges,就像下面的代码示例中那样。

示例

用于执行提交的事务成功完成后,DataContext 就会通过忽略更改跟踪信息接受对对象的更改。

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
// Make changes here.
try
{
    db.SubmitChanges();
}
catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    // Make some adjustments.
    // ...
    // Try again.
    db.SubmitChanges();
}
Dim db As New Northwnd("c:\northwnd.mdf")

' Make changes here.
Sub MakeChanges()
    Try
        db.SubmitChanges()
    Catch e As ChangeConflictException
        Console.WriteLine(e.Message)
        ' Make some adjustments 
        '...
        ' Try again.
        db.SubmitChanges()
    End Try
End Sub

请参阅