継承されたテーブルを使用しているときに、ON DELETE CASCADE で問題が発生しました。
次のテーブルがあります(モデルが最初)
ここで、Entity1 のエントリを削除したいとします。
using (var ctx = new MyEntities())
{
var first = ctx.Entity1Set.First();
ctx.DeleteObject(first);
ctx.SaveChanges();
}
シンプル...しかし、SaveChangesは次の例外をスローします。
DELETE ステートメントは、REFERENCE 制約 FK_EntityA_inherits_BaseEntity" と競合しました。データベース "MyDB"、テーブル "dbo.BaseEntitySet_EntityA"、列 'Id' で競合が発生しました。ステートメントは終了しました。
これを修正するにはどうすればよいですか?
アップデート
VS2010 と VS2012 のモデル デザイナーが SQL を出力する方法の違いに気付きました。
VS2010 :
-- Creating foreign key on [Id] in table 'BaseEntitySet_EntityA'
ALTER TABLE [dbo].[BaseEntitySet_EntityA]
ADD CONSTRAINT [FK_EntityA_inherits_BaseEntity]
FOREIGN KEY ([Id])
REFERENCES [dbo].[BaseEntitySet]
([Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
GO
-- Creating foreign key on [Id] in table 'BaseEntitySet_EntityB'
ALTER TABLE [dbo].[BaseEntitySet_EntityB]
ADD CONSTRAINT [FK_EntityB_inherits_BaseEntity]
FOREIGN KEY ([Id])
REFERENCES [dbo].[BaseEntitySet]
([Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
GO
DELETE NO ACTIONに関する注意事項
VS2012
-- Creating foreign key on [Id] in table 'BaseEntitySet_EntityA'
ALTER TABLE [BaseEntitySet_EntityA]
ADD CONSTRAINT [FK_EntityA_inherits_BaseEntity]
FOREIGN KEY ([Id])
REFERENCES [BaseEntitySet]
([Id])
ON DELETE CASCADE ON UPDATE NO ACTION;
GO
-- Creating foreign key on [Id] in table 'BaseEntitySet_EntityB'
ALTER TABLE [BaseEntitySet_EntityB]
ADD CONSTRAINT [FK_EntityB_inherits_BaseEntity]
FOREIGN KEY ([Id])
REFERENCES [BaseEntitySet]
([Id])
ON DELETE CASCADE ON UPDATE NO ACTION;
GO
DELETE CASCADEに関する注意事項
それはかなり重要です...