代码之家  ›  专栏  ›  技术社区  ›  Snæbjørn

如何处理继承表上的级联删除?

  •  0
  • Snæbjørn  · 技术社区  · 11 年前

    在使用继承的表时,我遇到了ONDELETE CASCADE的问题。

    我有以下表格(型号优先) database model

    现在,如果我想删除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的方式有所不同。

    与2010年相比 :

    -- 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
    

    注意 删除时无操作

    与2012年相比

    -- 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
    

    注意 删除级联时

    这相当重要。。。

    1 回复  |  直到 11 年前
        1
  •  0
  •   Snæbjørn    11 年前

    Visual Studio 2010 ADO实体设计器中似乎存在一个错误,导致生成不正确的SQL。

    与2010年相比:

    -- 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
    

    注意 删除时无操作

    与2012年相比

    -- 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
    

    注意 删除级联时

    将这些更改应用到数据库后,我可以毫无问题地删除。