1

外部キーにリンクされているさまざまなテーブルから一連のレコードを削除しています。'SubmitChanges'を呼び出すと、次のエラーが発生します。

DELETEステートメントがREFERENCE制約FK_PTXProductMap_CustomerProduct"と競合しました。データベース"SOTI"、テーブル" dbo.PTXProductMap "、列'InstanceId'で競合が発生しました。ステートメントは終了しました。

SubmitChangesが変更を保存しようとし、2つのレコードに対してDELETE SQL操作が呼び出されない場合に、どのクエリが実行されるかをプロファイラーで調べました。linq2sql-'DELETE'操作が呼び出されることを100%確信しています(次の行にブレークポイントを設定します:

IEnumerable<CustomerProduct> products = DbContext.CustomerProducts
    .Where(cp => cp.InstanceId == transition.InstanceId 
            || cp.InstanceId == transition.PreInstanceId);
foreach (CustomerProduct cp in products)
{
    DbContext.CustomerProducts.DeleteOnSubmit(cp);
}

必要なcpオブジェクトに対して呼び出されたかどうかを確認しました。DELETEは、同じテーブルからの2つの別のレコードに対して呼び出されます...ただし、必要なすべてに対してではありません

なぜこれが起こったのか考えがありますか?そしてそれを解決する方法は?

どんなアイデアでも大歓迎です。

PS私は64ビットWindows7でVS2008SP1、MSSQL2005を使用しています

PPS削除されたスコープにリンクされている別のテーブルのレコードをいくつか検出しました...削除によって現在のエラーが解決されましたが、削除するすべてのレコードに対して「DELETE」操作が生成されなかった理由はまだ不明です。

PPPS別のテーブルペアの場合と非常によく似た状況です。テーブルAには1つのレコードが含まれ、テーブルBにはA.1を参照する3つのレコードが含まれます。1つのトランザクションで削除することはできませんが、手動で(Management Studioを使用して)削除するとBから3つのレコードを削除してから、Aからレコードを削除することができます...なぜですか?

4

1 に答える 1

1

DeleteOnSubmit に関するこの記事には、カスケード削除に関する注意事項が含まれています。最初に子行を削除することをお勧めします。その後、親エンティティを削除しても問題はありません。

于 2010-09-03T13:35:53.077 に答える