為什麼EF7 / Core插入重複記錄?

c# entity-framework entity-framework-core

在我的域模型中,我有

class School
{
    public ICollection<Student> Students { get; set; }
}

class Student
{
    public ICollection<Course> Courses { get; set; }
}

class Teacher
{
    public ICollection<Course> Courses { get; set; }
}

class Course
{
    public Student Student { get; set; }

    public Teacher Teacher { get; set; }
}

假設我的數據庫中已有學生和教師

學生證= {C26A6D90-6D36-4CE9-9FF0-5C5BAB6994CC}

教師ID = {26ECCCC6-4A24-4FB2-A406-5021B693EE5E}

然後我想創建一個新課程

Course c = new Course(student, teacher);
repo.Add(c);
repo.Save();
  1. 我收到一個錯誤,告訴我我無法重新創建一個具有相同ID的學校
  2. 我收到一個錯誤,告訴我我無法重新創建具有相同ID的學生

基本上,我從數據庫( StudentTeacher )獲取記錄,然後嘗試使用它們來創建一個新的關係實體( Course

{System.Data.SqlClient.SqlException:違反PRIMARY KEY約束'PK_Schools'。無法在對象'dbo.Schools'中插入重複鍵。重複鍵值為(78434ef7-20db-42c8-448e-08d401d04461)。該語句已終止。

這似乎是一個EF7問題......它還不夠成熟 - 因為它不喜歡它!

一般承認的答案

非常感謝CodeNotFound值得一盃獎杯......

確保您使用相同的DbContext

所以我在我的服務配置和hey-presto AddTransient<,>更改為AddSingleton<,> !有用!

還要感謝D Stanley這個有用的片段:

為了公平對待那些不使用DI的人,另一個選擇是在保存課程之前將學生和教師對象附加到上下文。 Attach告訴EF該對像已存在於數據庫中,不應再次添加。

如果你發現這個,請不要為那些在你面前的人做好準備!



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow