实体框架:附加“MODELNAME”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值

时间:2017-08-14 19:16:56

标签: c# .net sql-server entity-framework

我发现了这个问题的多个帖子,但是我的问题没什么不同,显示的错误与我的方案完全匹配。

  1. 我在数据库下面有两个不同的模式。例如PreSchool.Students& School.Students。根据我们的要求,Students表的休息是相同的,包括主键。

  2. 现在在我的代码中,我正在使用以下代码更新'PreSchool.Students'的记录:

    var wouldBeUpdatedStudent = await context.Students
                .FindAsync(student.StudentIdentity).ConfigureAwait(false);
    wouldBeUpdatedStudent = student; //updated student object
    context.Entry(wouldBeUpdatedStudent).State = EntityState.Modified; // This line throws error 
    var result = await context.SaveChangesAsync().ConfigureAwait(false);
    
  3. OnModelCreating下,我明确设置tableName&每个实体SchemaName。通过这个,我期待每当我改变实体/模型状态时,它应该根据OnModelCreating下的设置捕获正确的表。然而,这种情况并没有发生,并引发异常。

  4.   

    如果没有级联到学生实体,我尝试使用context.Students.AsNoTracking()。但是,有一些级联/子实体也是相同的DDL。例如context.Student.Exams

1 个答案:

答案 0 :(得分:0)

逻辑上我没有得到答案,给出了正确的解释 - 修正了这个错误。但是This answer解决了我的问题。我观察到的另一个问题是解决方案是,如果新对象与每个实体底层数据库具有完全相同的值,则它不会更新表。

e.g。

context.Set<Student>().AddOrUpdate(wouldBeUpdatedStudent);
result = await context.SaveChangesAsync().ConfigureAwait(false);
  

原因我不能使用AsNoTracking()因为我有嵌套的实体,这些实体在其他模式中是相同的。因此,即使我在顶级实体中使用AsNoTracking(),我也会在子级别上获得相同的错误。 与我在问题中提到的相同。