![](/img/trans.png)
[英]EF adding entity: The relationship could not be changed because one or more of the foreign-key properties is non-nullable
[英]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; }
}
關系如下:
我正在嘗試像這樣更新學生實體:
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.