【问题标题】:Entity Framework Code first cycles or multiple cascade paths实体框架代码第一个循环或多个级联路径
【发布时间】:2016-12-07 08:09:21
【问题描述】:

我们有一个数据库正在创建一些多级联路径错误。 我确实理解这意味着什么以及正在发生什么,但我想知道最好的方法,因为我们必须删除我们拥有的一些 OnDelete Cascade 选项。

这是我们的表结构:

SCHOOL
- SchoolId  
- Name
- ....

STUDENT
- StudentId
- SchoolId
- Name
- ...

COURSE
- CourseId
- SchoolId
- Name

STUDENT-COURSE
- StudentId
- CourseId
- ....
  • Student 中的SchoolId FK 在删除学校时会删除所有级联相关的学生
  • 删除学校时,Course 中的SchoolId FK 会删除所有级联相关的课程
  • StudentId FK in Student-Course 在删除学生时会删除所有级联相关的学生课程
  • Student-Course 中的 CourseId FK 在删除课程时会删除所有级联相关的学生课程

所以这里我们有了循环,因为在删除学校时,实体 Student-Course 将从两个不同的方面删除,从而创建循环。

我明白这里发生了什么:

HasMany(p => p.Students)
   .WithRequired(p => p.School)
   .HasForeignKey(p => p.SchoolId)
   .WillCascadeOnDelete(true);  

我知道我能做到:

HasMany(p => p.Students)
    .WithRequired(p => p.School)
    .HasForeignKey(p => p.SchoolId)
    .WillCascadeOnDelete(false); 

这里的问题是什么是最好的方法。

谢谢。

【问题讨论】:

  • 学生可能比课程多,因此级联删除学生+学生课程更有效。

标签: entity-framework ef-code-first database-relations


【解决方案1】:

我会在删除级联时从学校中删除,并保持其他原样,并在删除学校时添加一些逻辑以删除相关的学生、课程(但他在较低级别保持删除的一致性)。 如果从Students的delete on delete cascade中删除,则需要先手动为它们添加删除逻辑来清理相关的学生课程,并且会与课程删除不一致(删除逻辑层次级别不一致)。

【讨论】:

  • 听起来不错,所以从上层移除并在代码中为这些层做一些逻辑。这样较低的级别不需要逻辑。谢谢!!!
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2019-06-06
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多