下面是程序的流程:如何還原更改對分離的實體
- 取實體列表,並使用它們。這將斷開/分離所有實體與上下文。
- 對其中一個實體進行更改並保存。我從上下文加載實體,並將分離實體的更改(標量屬性和關係)應用於新加載的實體。
我有一個功能,用戶可以恢復在斷開的實體上所做的所有更改。下面是我使用的代碼:
public async Task RevertChanges() { using (var db = new TwinTailDb()) { //Fansubs.Clear(); if (db.Entry(this).State == EntityState.Detached && Id != 0) { db.ArchiveEntries.Attach(this); await db.Entry(this).ReloadAsync(); } //await db.Entry(this).Collection(a => a.Fansubs).LoadAsync(); } }
然而,當我附上分離的實體,它拋出此異常:
附加信息:連接類型的實體「TwinTail.Entities .ArchiveEntry'失敗,因爲另一個相同類型的實體已具有相同的主鍵值。如果圖中的任何實體具有衝突的鍵值,則使用「附加」方法或將實體的狀態設置爲「未更改」或「已修改」時可能會發生這種情況。這可能是因爲一些實體是新的並且還沒有收到數據庫生成的關鍵值。在這種情況下,使用'Add'方法或'Added'實體狀態來跟蹤圖形,然後根據情況將非新實體的狀態設置爲'Unchanged'或'Modified'。
注意的方面,因爲我使用的是使用語句是自動處理。
我不知道爲什麼它甚至在主鍵上有衝突,因爲我之前沒有加載其他實體,因爲上一個上下文已經被處理了。
此外,如果我跳過第2步其中我保存實體中的所有更改,它不會引發異常。我留下來想,它仍然被追蹤。
編輯: 以下是我跳過附加時發生的情況,證明該實體是真正分離的。
附加信息:不能爲類型'ArchiveEntry'的實體調用成員'ReloadAsync',因爲該實體不存在於上下文中。要向上下文添加實體,請調用DbSet的Add或Attach方法。
嚴重的是,發生了什麼:(
你配置方面:http://mehdi.me/ambient-dbcontext-in-ef6/
固定結構,重裝後/恢復的實體可以簡單地通過調用完成在第2步? –
那麼,它會自動處理,因爲我使用的是「使用」語法。 – Sylpheed
通過它的PK查詢持久化實體不是最容易的,然後從那個點開始使用它?或者你是否專門嘗試恢復到實體具有的確切值,而不是當前的持久值? – Rytmis