2017-08-14 48 views
0

我发现这个问题有多个帖子,但是我的问题有点不同,显示的错误与我的场景。实体框架:附加类型'MODELNAME'的实体失败,因为另一个相同类型的实体已经具有相同的主键值

  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的设置捕捉正确的表格。但是,这不会发生并抛出异常。

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

+0

几年前我问了一个非常类似的问题。那时的答案是“实体框架不支持Sql Server中不同模式中的同名表。” –

+0

@ SamAxe,幸运的是,我试过[这个答案](https://stackoverflow.com/a/31771363/659538)并为我工作。 – Kenz

回答

0

从逻辑上讲,我没有得到答案,给出了适当的解释 - 修正了这个错误。但This answer解决了我的问题。还有一种观点认为我的解决方案是,如果新对象具有与每个实体基础数据库完全相同的值,则不会更新表。

例如

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

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

相关问题