既定の動作をオーバーライドするときの開発者の責任 (LINQ to SQL)

更新 : November 2007

LINQ to SQL では、以下の要件を満たすことは強制ではないものの、これらの要件を満たさなかった場合の動作は未定義です。

  • オーバーライドするメソッドでは、SubmitChanges および Attach を呼び出さないでください。オーバーライド メソッドでこれらのメソッドを呼び出した場合、LINQ to SQL は例外をスローします。

  • オーバーライド メソッドは、トランザクションの開始、コミット、および中断には使用できません。SubmitChanges 操作はトランザクションの下で実行されます。入れ子になった内側のトランザクションは、外側のトランザクションと干渉する可能性があります。読み込みのオーバーライド メソッドでは、Transaction 内で実行されている操作でないことを確認した場合にのみ、トランザクションを開始できます。

  • オーバーライド メソッドでは、該当するオプティミスティック同時実行の対応付けに従うことが望まれます。オプティミスティック同時実行の競合が発生した場合、オーバーライド メソッドが ChangeConflictException をスローすることが望まれます。この例外は LINQ to SQL によってキャッチされるため、SubmitChanges で指定した SubmitChanges オプションを適切に処理できます。

  • 作成 (Insert) および Update のオーバーライド メソッドでは、操作が正常に完了した場合、データベースによって生成された列の値を、対応するオブジェクト メンバに反映することが望まれます。

    たとえば、Order.OrderID が ID 列 (自動インクリメントの主キー) に割り当てられている場合、InsertOrder() オーバーライド メソッドでは、データベースが生成した ID を取得して、Order.OrderID メンバにその ID を設定する必要があります。同様に、タイムスタンプ型のメンバは、データベースが生成したタイムスタンプ値に更新して、更新後のオブジェクトの一貫性を維持する必要があります。データベースが生成した値を反映しなかった場合、データベースと、DataContext が追跡するオブジェクトとの間で、矛盾が生じる可能性があります。

  • 正しい動的 API を呼び出す必要があります。たとえば、更新のオーバーライド メソッドで呼び出すことができるのは ExecuteDynamicUpdate のみです。呼び出した動的メソッドが対象の操作に一致するかどうかについて、LINQ to SQL は、検出や検査は行いません。適合しないメソッドを呼び出した場合 (たとえば、更新するオブジェクトについて ExecuteDynamicDelete を呼び出した場合)、結果は未定義です。

  • オーバーライド メソッドでは、決められた操作を実行することが望まれます。Eager Loading、遅延読み込み、SubmitChanges など、LINQ to SQL 操作のセマンティクスでは、決められたサービスをオーバーライド メソッドで提供する必要があります。たとえば、読み込みのオーバーライドで、データベースの内容をチェックせずに空のコレクションを返した場合、データの矛盾につながる可能性があります。

参照

その他の技術情報

挿入、更新、および削除の各操作のカスタマイズ (LINQ to SQL)