方法 : データベースに変更内容を送信する (LINQ to SQL)
オブジェクトに加えた変更は、その数にかかわらず、メモリ内のレプリカに対してのみ反映されています。 データベースの実際のデータは変更されていません。 DataContext の SubmitChanges を明示的に呼び出すまでは、変更内容はサーバーに送信されません。
この呼び出しを行うと、DataContext は、変更内容を、同等の SQL コマンドに変換します。 独自のカスタム ロジックを使用してこれらの処理をオーバーライドすることもできますが、発行の順序は、変更プロセッサと呼ばれる DataContext のサービスによって調整されています。 イベントの順序は次のとおりです。
SubmitChanges を呼び出すと、LINQ to SQL は、一連の既知のオブジェクトをチェックして、新しいインスタンスがアタッチされているかどうかを判断します。 その場合、それらの新しいインスタンスが、一連の追跡対象オブジェクトに追加されます。
保留中の変更があるすべてのオブジェクトが、互いの依存関係に基づいて、オブジェクトのシーケンスに配置されます。 他のオブジェクトに依存して変更内容が決まるオブジェクトは、その依存対象の後でシーケンスに配置されます。
LINQ to SQL は、実際の変更を送信する直前に、一連の各コマンドをカプセル化するトランザクションを開始します。
オブジェクトに対する変更内容が 1 つずつ SQL コマンドに変換され、サーバーに送信されます。
この時点で、データベースによってエラーが検出された場合、送信処理は中断され、例外が発生します。 データベースに加えた変更はすべてロールバックされ、送信を行わなかった場合と同じ状態になります。 この時点でも、DataContext には、すべての変更内容の記録がそのまま残っています。 したがって、次のコード例のように、問題を修正したうえで SubmitChanges を再度呼び出すことができます。
使用例
一連の送信処理のトランザクションが正常に完了した場合、DataContext は、変更追跡情報を無視して、オブジェクトに対する変更を受け入れます。
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
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();
}
参照
処理手順
方法 : 送信の競合を検出および解決する (LINQ to SQL)
概念
サンプル データベースのダウンロード (LINQ to SQL)