2017-08-14 94 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(),我也會得到與子級別相同的錯誤。 和我在我的問題中提到的一樣。

相關問題