簡體   English   中英

實體框架4將數據合並到跟蹤的實體

[英]Entity Framework 4 merge data to tracked entity

我正在努力處理實體框架代碼並進行合並。 我有一個帶有通用存儲庫的MVC控制器。 發布了一個視圖模型,然后將其轉換為EF知道的類型

    var converted = AutoMapper.Mapper.Map<RoutineViewModel, Routine>(result);
    _routineRepository.Update(converted);

在存儲庫中,我有:

/*   
            Routines.Attach(item);
            ChangeTracker.Entries<Routine>().Single(x => x.Entity.Id == item.Id).State = EntityState.Modified;*/
            var match = Routines.Single(x => x.Id == item.Id);
            var entity = Entry(match);

            entity.CurrentValues.SetValues(item);

我注釋掉了第一位,因為即使進行如下檢查,它也會引發關於已經跟蹤實體的錯誤:

if (ChangeTracker.Entries<Routine>().Count(x => x.Entity.Id == item.Id) != 0)

返回假

我遇到的問題是Routine對象具有Steps的ICollection屬性。 當我設置跟蹤實體的值以匹配poco的值時,不會將ICollection更改向下傳播。 環顧這個網站,似乎有一些討厭的遞歸調用。 這真的是這樣嗎,還是我錯過了什么?

有什么簡單的方法可以說,這是源對象(未跟蹤),將有關它的所有內容都復制到跟蹤對象中嗎?

為了清楚起見,我不認為首先獲取對象並更新其屬性不應在存儲庫之外進行。 這似乎不僅迫使您跨域邊界傳遞數據模型,而且還似乎代替了等效的SQL like語句(在id = 1的temp表中插入(更新x,y,id = 1)以達到范圍)臨時表中的行,現在為表更新表中的每一行更新x ..... x = tempx,其中id = 1)

編輯-所以問題在於setValues不是遞歸調用。 例程對象具有2個簡單屬性(id和name)和一個復雜屬性(ICollection)。 如果進來的項目的名稱已更改,並且某些步驟已更改,則setValues會選擇名稱更改,但不適用於子項。 還有其他方法嗎? 對於我來說,必須手動啟用此功能似乎有點不可思議

據我所知,您正在創建您的實體,填充屬性,然后將其附加到數據庫。 對於EF,這有點不對勁。

如果要附加一個已經存在於數據庫中但未被跟蹤的對象,則可以使用attach,但僅記錄在attach調用之后所做的更改才能提交給數據庫。 如果要使用附加,請確保在調用該方法后進行更改。

另外,EF僅允許您附加當前不在對象圖中的對象。 因此,如果您嘗試將相同的對象附加兩次(或附加相同的鍵),則會出現錯誤,例如您看到的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM