簡體   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