次の方法で共有


既定の動作をオーバーライドする開発者の責任

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 操作のセマンティクスでは、指定されたサービスを提供するためにオーバーライドが必要です。 たとえば、データベース内の内容を確認せずに空のコレクションを返すだけの読み込みオーバーライドは、データの不整合につながる可能性があります。

こちらも参照ください