c# - 尝试删除"Adding a relationship with an entity which is in the Deleted state is not allowed"set in optional relationship时出现"many"

标签 c# entity-framework

我有一个一对多关系,我试图在“多”方删除一组实例,但不断收到异常“不允许添加与处于已删除状态的实体的关系”。这是 Entity Framework 6.1.1。

从教师到类(class)是一对多的关系。这两个类定义为:

[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; }
}

试图删除类(class)的代码是导入的一部分:一组类(class)正在传入,数据库中但不属于传入类(class)的类(class)应从数据库中删除。 (此外,应该创建属于传入集但不在数据库中的类(class),但这似乎可行)。

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

传入的类(class)集从 XML 文件解析为 DTO。在将它们与现有类(class)进行比较之前,它们被放置在一个列表中:

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

Course 实体上还有其他属性可标识类(class),但我没有在此处显示它们,因为我认为它们无关紧要。

调试时,我注意到正在删除的类(class)的 Teacher 属性在调用 RemoveRange() 之前是非空的,但之后是 null ..所以似乎有某种发生级联删除。

我试图通过我的 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);
    }
}

最佳答案

@LukasKabrt 的评论为我指明了正确的方向。我没有直接比较 Course 对象,而是在 LINQ 中“临时”将现有类(class)转换为 DTO 并比较 DTO。现在我可以从 coursesToDelete

中删除所有内容
var coursesToDelete = (
      from e in existing
      let dto = new CourseDto(e)
      where !incomingDtos.Contains(dto)
      select e).ToList();

关于c# - 尝试删除"Adding a relationship with an entity which is in the Deleted state is not allowed"set in optional relationship时出现"many",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693066/

相关文章:

c# - 在 GridView 中的 rowcommand 事件中将文本框值转换为整数

c# - 如何在线显示 PDF 而不担心未经许可共享?

c# - 保存对象并立即将其取回

c# - await SignInManager.PasswordSignInAsync() 总是导致我的 ASP.NET MVC 项目失败

c# - 如何在至少打开一个模式窗口时最小化 winforms 应用程序

C# - 无法在 LINQ to Entities 查询中构造实体或复杂类型

c# - 在 Entity Framework 中不使用 Dispose 或 using()

asp.net-mvc - 您可以将 Orchard CMS 与 Entity Framework 5 一起使用而不是 NHibernate 吗?

.net - Entity Framework : EF gets related objects of an entity in different order

c# - 从 C# 访问 AD 时出现 "A referral was returned from the server"异常