8

我正在使用 VS2012 和实体设计器来生成数据库和模型。我有一个非常基本的 Table1 到 Table1 和 2JoinTable 到 Table2 的场景。像学生,班级,学生班级之类的东西。您可以在许多班级中拥有许多学生。我想要级联删除。因此,如果您删除一个学生,StudentClass 连接表中的任何行都会针对该学生 ID 删除。删除一个班级也是如此,该班级 ID 的 StudentClass 中的任何行都将被删除。在设计器中设置多对多关联并设置级联删除选项后,当您尝试生成数据库时会收到以下错误:

错误 132:关系 'Model1.StudentClass' 上的 End 'Student' 无法指定操作,因为它的多重性是 ' '。不能在具有多重性“ ”的末端指定操作。

这是一个小例子:

设计师

这是创建的关联:

在此处输入图像描述

以及由此产生的错误消息:

在此处输入图像描述

下面是生成数据库表的部分 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 选项来解决这个问题。但是,我不想这样做,因为随着项目的发展,我会多次回到设计师那里,我不想每次都记住这一步。

有没有人想出如何解决这个问题?

4

2 回答 2

4

这似乎是一个 edmx 限制,我不太明白。代码优先完全能够生成具有两个级联 ON DELETE 约束的联结表,但模型优先和数据库优先不允许在 edmx 中进行相同的配置。通常,级联操作配置在关联的“一个”端。也许检查' *'端的级联动作的有效性太复杂了(只有当两端都是' *'时)。

要在基于 edmx 模型的上下文中发生级联删除,您必须加载父级及其子级,然后删除父级。

var cls = db.Classes.Include(c => c.Students).Single(c => c.Id = 1);
db.Classes.Remove(cls);
db.SaveChanges();

执行的 SQL 语句显示Class是从数据库中以带有 的JOIN语句获取的Student。然后StudentClasss 和 theClass分别被删除。

显然,这比在数据库中启用级联删除要昂贵得多。

当然,每次生成后修改 DDL 的变通方法并不吸引人。但我认为唯一的选择是制作StudentClass模型的一部分并在新关联的“一个”端配置级联删除。或者去代码优先。

于 2013-12-22T10:52:08.350 回答
0

首先确保您在数据库端的外键ON DELETE CASCADE中指定了一个。我有类似的问题,只是添加解决它而不是设置和属性。ON DELETE CASCADEEnd1OnDeleteEnd2OnDelete

于 2016-07-11T13:15:33.833 回答