0

我正在製作一個調查程序,其中包含作爲實體從數據庫中提取的問題列表。在調查過程中,可以編輯實體的屬性,但我不希望這些更改持久存在數據庫中。因此,我將這些問題在加載到dbcontext後分離,並通過字典訪問它們。使用Entity Framework保存更改會導致分離的實體重複

當我嘗試保存對數據庫的答案時出現問題。由於答案實體與問題實體(已被分離)相關,因此將一個全新的問題實體添加到數據庫中。我不確定爲什麼會出現這種情況,因爲添加的答案實體包含分離實體的正確ID(當我在調試器中查看它時)。但是,保存更改後,它會更新爲新創建的重複實體的ID。

有沒有辦法阻止這種行爲?或者,有沒有方法可以對實體進行更改,並且即使在上下文中調用SaveChanges以便將答案或日誌條目寫入數據庫時​​,也不會將它們保存到數據庫?

這裏是一個負載,然後detatches問題(項目)的代碼:

public FixedLengthBlockElementRuntime(FixedLengthBlock block, RuntimeContext context) : base(block, context) 
    { 
     this._items = ((FixedLengthBlock)this.Element).ItemBank.Items.OfType<FixedLengthItem>().ToDictionary(x => x.ItemName, x => x); 


     foreach(FixedLengthItem fixedLengthItem in this._items.Values) 
     { 
      this.Context.DetachEntity(fixedLengthItem); 
     } 
    } 

這裏是添加重複條目代碼:

public void SetResponse(Response response) 
    { 
     response.Session = this.Session; 
     this.DbContext.Responses.AddObject(response); 
     this.DbContext.SaveChanges(); 
    } 

需要注意的是響應具有適當的ItemId直到保存更改。

+0

請添加代碼 –

+0

你在哪裏連接問題的答案嗎? –

+0

通過edmx文件中的關聯。所以我相信它是自動的。 – Scottingham

回答

1

你可以在你的問題DbSet上設置MergeOption OverwriteChanges。

Context.Questions.MergeOption = MergeOption.OverwriteChanges; 

但是,您需要確保在對問題進行查詢之前設置該參數,以使其正常工作。

More reading關於如何在MergeOptions工作

+0

對不起,我走了一條CF路線 - 更新了更好的答案,型號第一 –

+0

這不起作用。儘管我開始走上這條路。有沒有辦法離開附加的實體,但忽略保存到數據庫時可能發生的任何更改?我認爲像'DbContext.Items.ApplyOriginalValues'會做的伎倆,但它沒有奏效。 – Scottingham

+0

一個想法是設置合併選項以覆蓋更改...然後在保存響應之前從數據庫中重新加載項目?它有效,但感覺效率低下......任何想法? – Scottingham

相關問題