尝试删除实体之间的关系并创建新实体时,我收到此错误。
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; }
}
关系如下:
我正在尝试更新这样的学生实体:
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;
}
}
在不删除实际课程的情况下,应删除学生与课程之间的关系。 更新书籍和学生之间的关系时,也应删除该书。
修改 更新以使其更清晰
答案 0 :(得分:1)
如果要从数据库中删除1-many集合中的项目,则必须将每个项目标记为要删除,例如像这样:
foreach (var book in record.Books)
{
context.Books.Remove(book);
}
context.SaveChanges();
有时令人讨厌。当您Clear
收集导航属性时,EF会谨慎行事并尝试仅在不删除项目的情况下中断关联,即尝试使外键无效。但是,EF 确实知道 FK字段在数据库中不可为空,所以在我看来,EF 应能够弄清楚在这种情况下它是&#39用户删除项目的意图,而不是孤立他们的意图。但太糟糕了,它没有。
我曾经使用NHibernate和IIRC,NHibernate在类似的情况下确实删除了子项,甚至开了一次删除(delete from Child where Child.ParentId = ...
)。 EF分别为每个孩子发布删除声明。