繁体   English   中英

EF 6.1.1-无法更改关系,因为一个或多个外键属性不可为空

[英]EF 6.1.1 - The relationship could not be changed because one or more of the foreign-key properties is non-nullable

尝试删除实体之间的关系并创建新实体时,出现此错误。

public partial class Course
{
    public int Course_ID { get; set; }
    /* CODE*/
    public virtual ICollection<Student> Students { get; set; }
}

public partial class Student
{
    public int Student_ID { get; set; }
    /* CODE*/
    public virtual ICollection<Course> Courses { get; set; }
    public virtual ICollection<Book> Books { get; set; }
}

public partial class Book
{
    public int Book_ID { get; set; }
    public int Student_ID { get; set; }
    /* CODE*/
    public virtual Student Student { get; set; }
}

关系如下:

  • 课程*-*学生(学生和课程之间存在多对多关系,因此在标准化过程中创建了表格Student_Courses-一个学生可以参加多个课程,而一个课程有多个学生)
  • 学生1-*书籍(学生与书籍具有一对多关系-一个学生有很多书籍,而一本书属于一个学生)

我正在尝试像这样更新学生实体:

    public bool UpdateEntity(Entities.Student student)
    {
        using (var context = new Entities())
        {
            var record = context.Students
                                .Include("Courses")
                                .Include("Books")
                                .FirstOrDefault(c => c.Student_ID == student.Student_ID );

            // record.Courses.ToList().ForEach(s => record.Courses.Remove(s));
            // record.Books.ToList().ForEach(t => record.Books.Remove(t));

            record.Courses.Clear();
            record.Books.Clear();

            record.Courses= student.Courses;
            record.Books= student.Books;
            context.SaveChanges();

            return true;
        }
    }

学生和课程之间的关系应该删除而不删除实际课程。 更新书本与学生之间的关系时,也应删除该书。

编辑已更新,使其更清晰

当您要从数据库中删除多个集合中的项目时,必须将每个项目标记为删除,例如:

foreach (var book in record.Books)
{
    context.Books.Remove(book);
}
context.SaveChanges();

有时候很麻烦。 当您Clear集合导航属性时,EF谨慎行事,并尝试仅中断关联而不删除项目,即,其尝试使外键无效。 但是,EF 确实知道 FK字段在数据库中不能为空,因此在我看来,EF 应该能够弄清楚在这种情况下,用户的目的是删除项目而不是孤立项目。 但是太糟糕了,事实并非如此。

我曾经与NHibernate和IIRC一起工作过,NHibernate确实在类似情况下删除了子项,甚至触发了一次删除操作( delete from Child where Child.ParentId = ... )。 EF分别为每个孩子触发一个delete语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM