既定の動作をオーバーライドするときの開発者の責任
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 を呼び出した場合)、結果は未定義です。
オーバーライド メソッドでは、決められた操作を実行することが望まれます。 一括読み込み、遅延読み込み、SubmitChanges など、LINQ to SQL 操作のセマンティクスでは、決められたサービスをオーバーライド メソッドで提供する必要があります。 たとえば、読み込みのオーバーライドで、データベースの内容をチェックせずに空のコレクションを返した場合、データの矛盾につながる可能性があります。