【问题标题】:EF 6.1.1 - The relationship could not be changed because one or more of the foreign-key properties is non-nullableEF 6.1.1 - 无法更改关系,因为一个或多个外键属性不可为空
【发布时间】:2014-11-19 05:18:39
【问题描述】:

我在尝试删除实体之间的关系并创建新关系时遇到此错误。

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

关系如下:

  • Course * -- * Student(Student 和 Course 具有多对多关系,因此在规范化过程中创建了 Students_Courses 表 - 一个学生可以参与多个课程并且一个课程有多个学生)
  • Student 1--* Book(Student 与 Book 是一对多的关系 - 一个学生有很多书,而一本书属于一个学生)

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

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

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

编辑 更新以使其更清晰

【问题讨论】:

  • 您正在孤立您的Cs,这会将外键B_ID 设置为null,但它是一个不可为空的int。你真的想删除你的Cs 而不仅仅是孤立它们吗?如果不是,你想做什么?
  • 我正在尝试从数据库中完全删除 Cs,只删除 A 和 B 之间的关系(因此只需更新 AList 而不删除任何内容)

标签: c# .net asp.net-mvc entity-framework


【解决方案1】:

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

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 分别为每个孩子触发一个删除语句。

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 2013-10-19
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多