【问题标题】:Why is EF7/Core inserting duplicate records?为什么 EF7/Core 插入重复记录?
【发布时间】: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();
  1. 我收到一条错误消息,告诉我无法重新创建具有相同 ID 的学校
  2. 我收到一条错误消息,告诉我无法重新创建具有相同 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 之前将 Attach studentteacher 对象添加到上下文中。 Attach 告诉 EF 该对象已存在于数据库中,不应再次添加。
  • @DStanley 谢谢,这是有用的信息,我将在我的回答中复制(请原谅双关语):)

标签: c# entity-framework entity-framework-core


【解决方案1】:

非常感谢CodeNotFound,他值得为...赢得奖杯

确保您使用的是相同的 DbContext

所以我在我的服务配置中将AddTransient&lt;,&gt; 更改为AddSingleton&lt;,&gt;,嘿嘿!它有效!

也感谢D Stanley 提供了这个有用的sn-p:

为了公平对待那些不使用 DI 的人,另一种选择是附加 学生和老师在保存之前反对上下文 课程。 Attach 告诉 EF 对象已经存在于数据库中 并且不应再次添加。

如果你发现了这个,请为那些在你之前走过的人多想想!

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多