Entity Framework での削除に問題があります。つまり、データベースでカスケード削除を使用するように EF を明示的に構成したにもかかわらず、EF は明示的にデータベースからエンティティを削除しようとします。
私のデザイン:
MainEntity
、およびの 3 つのエンティティ タイプがEntityTypeA
ありEntityTypeB
ます。EntityTypeA
EF は、 および を削除するときにカスケード削除を使用するように構成されていますEntityTypeB
。つまり、 のインスタンスを削除するとMainEntity
、関連するEntityTypeA
およびEntityTypeB
インスタンスもすべて削除されます。親を削除せずに、EntityTypeA
または削除することはありません。EntityTypeB
私の問題は、EF が に対して明示的にDELETE
ステートメントを発行しEntityTypeA
、アプリケーションがクラッシュすることです。
これは私のモデルがどのように見えるかです:
リレーションには、次のデフォルト以外の構成があります。
MainEntity -> EntityTypeA OnDelete: Cascade
MainEntity -> EntityTypeB OnDelete: Cascade
関係EntityTypeA -> EntityTypeB
はOnDelete: None
データベースの内容
INSERT INTO MainEntities (Name) values ('Test')
insert into EntityTypeA (MainEntityID) VALUES (1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
私のコード:
class Program
{
static void Main(string[] args)
{
var context = new Model1Container();
var mainEntity = context.MainEntities.Include("EntityTypeA").SingleOrDefault();
context.DeleteObject(mainEntity);
context.SaveChanges();
}
}
何が起こるのですか
SaveChanges を呼び出すと、Entity Framework はデータベースで次の処理を実行します。
exec sp_executesql N'delete [dbo].[EntityTypeA]
where ([Id] = @0)',N'@0 int',@0=1
EntityTypeB のテーブルに EntityTypeA インスタンスを参照する項目があるため、これにより外部キー違反が発生します。
質問
カスケード削除を使用するように Entity Framework を構成したにもかかわらず、Entity Framework が EntityTypeA のインスタンスに対して明示的な削除を発行するのはなぜですか? Include("EntityTypeA") を削除すると、再び機能し始めます。