如何在Edmx设计器中启用多对多关系的级联删除

8
我正在使用VS2012和实体设计器来生成数据库和模型。 我有一个非常基本的场景,从Table1到Table1and2JoinTable到Table2。 就像学生,课程,学生课程这样的东西。 你可以在许多课程中有许多学生。 我想要级联删除。 因此,如果您删除学生,则会删除该学生ID的StudentClass连接表中的任何行。 删除班级时,也是如此,将为该班级ID删除StudentClass中的任何行。 在设计器中设置了多对多关联并设置了级联删除选项后,尝试生成数据库时会出现以下错误:
错误132:由于其多重性为'',因此关系'Model1.StudentClass'上的端口'Student'无法指定操作。不能在具有多重性''的端口上指定操作。
这里是一个小例子:
Designer 这里是创建的关联:
enter image description here 结果错误信息:
enter image description here 这是用于生成数据库表的SQL代码的一部分:
-- Creating foreign key on [Students_Id] in table 'StudentClass'
ALTER TABLE [dbo].[StudentClass]
ADD CONSTRAINT [FK_StudentClass_Student]
    FOREIGN KEY ([Students_Id])
    REFERENCES [dbo].[Students]
        ([Id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
-- This should be ON DELETE CASCADE ON UPDATE NO ACTION;
GO

-- Creating foreign key on [Classes_Id] in table 'StudentClass'
ALTER TABLE [dbo].[StudentClass]
ADD CONSTRAINT [FK_StudentClass_Class]
    FOREIGN KEY ([Classes_Id])
    REFERENCES [dbo].[Classes]
        ([Id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
-- This should be ON DELETE CASCADE ON UPDATE NO ACTION;
GO

我知道如何解决这个问题,只需编辑数据库脚本并添加on delete cascade选项即可。但是,我不想这样做,因为随着项目的增长,我会多次回到设计师,并且我不想每次都记住这一步骤。
有人解决了这个问题吗?

许多对多关系上的级联删除应该是自动的,无需任何配置。 - Ladislav Mrnka
1
是的,这应该是默认行为,但实际上并不是。生成表的 SQL 语句在联接表中有以下内容:ON DELETE NO ACTION。这应该改为 ON DELETE CASCADE。我已经将完整的 SQL 语句添加到原始问题中。 - Bruce C
2个回答

4
似乎是edmx的限制,我并不是很理解。Code-first可以很好地生成具有两个级联ON DELETE约束的连接表,但model-first和database-first不允许在edmx中进行相同的配置。通常,级联操作是在关联的“one”端进行配置的。也许在“*”端(只有当两端都为“*”时)检查级联操作的有效性过于复杂。要使用基于edmx模型的上下文进行级联删除,您必须加载父项及其子项,然后删除父项。
var cls = db.Classes.Include(c => c.Students).Single(c => c.Id = 1);
db.Classes.Remove(cls);
db.SaveChanges();

执行的SQL语句显示,Class是在与Student连接的JOIN语句中从数据库中获取的。然后,分别删除了StudentClassClass
显然,这比在数据库中启用级联删除要昂贵得多。
修改每次生成DDL后的解决方法显然不太好。但我认为唯一的选择是将StudentClass作为模型的一部分,并在新关联的“one”端配置级联删除。或者采用代码优先方法。

0
首先,确保在数据库端的外键上指定了ON DELETE CASCADE。我曾经遇到过类似的问题,只需添加ON DELETE CASCADE即可解决,而不是设置End1OnDeleteEnd2OnDelete属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接