0

継承されたテーブルを使用しているときに、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に関する注意事項

それはかなり重要です...

4

1 に答える 1

0

Visual Studio 2010 ADO エンティティ デザイナーにバグがあり、正しくない 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に関する注意事項

これらの変更をデータベースに適用した後、問題なく削除できました。

于 2013-04-05T09:53:54.163 に答える