";不允许添加与处于“已删除”状态的实体的关系;当试图删除“;许多“;设置为可选关系

本文关键字:删除 关系 实体 许多 设置 添加 不允许 quot 已删除 状态 | 更新日期: 2023-09-27 18:21:44

我有一个一对多的关系,我试图删除"多"侧的一组实例,但不断收到异常"不允许添加与处于已删除状态的实体的关系"。这是实体框架6.1.1。

从教师到课程,这种关系是一对多的。这两类定义为:

[Table("Course")]
public partial class Course {
    public int Id { get; set; }
    public int? TeacherId { get; set; }
    public virtual Teacher Teacher { get; set; }
}

[Table("Teacher")]
public partial class Teacher
{
    public Teacher()
    {
        Course = new HashSet<Course>();
    }
    public int Id { get; set; }
    [Required]
    [StringLength(50)]
    public string TeacherName { get; set; }
    public virtual ICollection<Course> Course { get; set; }
}

尝试删除课程的代码是导入的一部分:一组课程正在进入,数据库中但不属于进入课程的课程应该从数据库中删除。(此外,应该创建属于传入集合但不在数据库中的课程,但这似乎有效)。

var existingCourses = ctx.Courses.ToList();
var toCreate = incomingCourses.Where(x => !existingCourses.Contains(x)).ToList();
var coursesToDelete = existingCourses.Where(x => !incomingCourses.Contains(x)).ToList();
ctx.Courses.RemoveRange(coursesToDelete);
ctx.SaveChanges(); // The exception occurs here

传入的课程集从XML文件解析为DTO。在将它们与现有课程进行比较之前,它们被列为:

var incomingCourses = incomingDtos.Select(x => new Course
{
    Teacher = new Teacher { TeacherName = x.TeacherNameFromXml }
}.ToList();

Course实体上还有其他用于标识课程的属性,但我没有在这里显示它们,因为我认为它们是无关的。

调试时,我注意到正在删除的课程的Teacher属性在调用RemoveRange()之前不为空,但在调用之后为空。。因此,似乎有某种级联删除正在发生。

我已经尝试通过我的DbContext删除所有级联删除,并在那里指定关系。这不会改变任何事情。

public class MyDbContext : DbContext {
    public MyDbContext() {}
    public MyDbContext(string connectionString) {
        Database.Connection.ConnectionString = connectionString;
    }
    public virtual DbSet<Teacher> Teacher { get; set; }
    public virtual DbSet<Course> Courses { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Entity<Teacher>()
            .HasMany(x => x.Course)
            .WithOptional(x => x.Teacher)
            .HasForeignKey(x => x.TeacherId)
            .WillCascadeOnDelete(false);
    }
}

";不允许添加与处于“已删除”状态的实体的关系;当试图删除“;许多“;设置为可选关系

@LukasKabert的评论为我指明了正确的方向。我没有直接比较Course对象,而是在LINQ中将现有课程"临时"转换为DTO,并比较DTO。现在我可以从coursesToDelete 中删除所有内容

var coursesToDelete = (
      from e in existing
      let dto = new CourseDto(e)
      where !incomingDtos.Contains(dto)
      select e).ToList();