Bru*_*e C 7 entity-framework edmx-designer entity-framework-5 visual-studio-2012
我使用VS2012和实体设计器来生成数据库和模型.我有一个非常基本的表1到Table1和2JoinTable到Table2的场景.像学生,班级,学生班这样的东西.你可以在很多课程中有很多学生.我想有一个级联删除.因此,如果您删除学生,则会删除StudentClass连接表中的任何行以获取该学生ID.对于删除类,同样删除StudentClass中的任何行以用于该类ID.在设计器中设置多对多关联并设置级联删除选项后,在尝试生成数据库时会出现以下错误:
错误132:关系'Model1.StudentClass'结束'学生'不能指定操作,因为它的多重性是' '.不能在具有多重性' '的末尾指定操作.
这是一个小例子:

这是创建的关联:

并产生错误消息:

以下是用于生成数据库表的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
Run Code Online (Sandbox Code Playgroud)
我知道如何通过编辑数据库脚本并添加on delete cascade选项来解决这个问题.但是,我不想这样做,因为随着项目的发展,我会多次回到设计师那里,而且我不想每次都记住这一步.
有没有人想出如何解决这个问题?
这似乎是一个 edmx 限制,我不太明白。代码优先完全能够生成具有两个级联 ON DELETE 约束的联结表,但模型优先和数据库优先不允许在 edmx 中进行相同的配置。通常,级联操作配置在关联的“一端”。也许太复杂了,无法检查' '端的级联动作的有效性*(仅当两端都是' *'时)。
为了在基于 edmx 模型的上下文中进行级联删除,您必须加载父级及其子级,然后删除父级。
var cls = db.Classes.Include(c => c.Students).Single(c => c.Id = 1);
db.Classes.Remove(cls);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
执行的 SQL 语句显示 是在语句Class中从数据库中获取的。然后分别删除s和the 。JOINStudentStudentClassClass
显然,这比在数据库中启用级联删除要昂贵得多。
当然,每次生成 DDL 后都修改 DDL 的解决方法并不具有吸引力。但我认为唯一的选择是制作StudentClass模型的一部分并在新关联的“一端”配置级联删除。或者先写代码。
| 归档时间: |
|
| 查看次数: |
5827 次 |
| 最近记录: |