【发布时间】:2016-11-01 06:07:02
【问题描述】:
在我的领域模型中
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; }
}
假设我的数据库中已经有一个学生和一个老师
学生 ID = {C26A6D90-6D36-4CE9-9FF0-5C5BAB6994CC}
教师 ID = {26ECCCC6-4A24-4FB2-A406-5021B693EE5E}
然后我想创建一个新课程
Course c = new Course(student, teacher);
repo.Add(c);
repo.Save();
- 我收到一条错误消息,告诉我无法重新创建具有相同 ID 的学校
- 我收到一条错误消息,告诉我无法重新创建具有相同 ID 的学生
基本上,我从数据库中获取记录 (Student & Teacher),然后尝试使用它们创建新的关系实体 (Course)
{System.Data.SqlClient.SqlException:违反主键 约束“PK_Schools”。无法在对象中插入重复键 'dbo.Schools'。重复键值为 (78434ef7-20db-42c8-448e-08d401d04461)。该声明已 终止。
这似乎是一个 EF7 的问题......它只是还不够成熟 - 因为感觉不像!
【问题讨论】:
-
确保您使用的是相同的 DbContext
-
@CodeNotFound ... OH MY DAYS...你一定是 ******* 在开玩笑! :@ - 我在我的 DbContext 和 Repos 上将 AddTransient 更改为 AddSingleton 并且它工作 GRRRRRRRRRR !!! - 这个的文档在哪里!!?!?!?!
-
:D 添加您自己的答案并接受它作为答案。所以未来的开发者会知道如何解决这个问题;-)
-
为了公平对待那些不使用 DI 的人,另一种选择是在保存
course之前将Attachstudent和teacher对象添加到上下文中。Attach告诉 EF 该对象已存在于数据库中,不应再次添加。 -
@DStanley 谢谢,这是有用的信息,我将在我的回答中复制(请原谅双关语):)
标签: c# entity-framework entity-framework-core