2

在每一個我POCO的的構造函數中我有這樣的:自我跟蹤實體 - 從導航屬性中刪除不設置狀態設置爲「已刪除」

this.StartTracking(); 

爲了確保跟蹤開啓一個的每個實例我的POCO的。我有一個實體A包含實體B的TrackableCollection當我載入我的實體A的實例像這樣的:

using(MyContext ctx = new MyContext()) 
{ 
    entityA = ctx.EntityA.Include("EntityB").Where(x => x.Id== id).FirstOrDefault(); 
} 

放眼於實體A的ObjectsAddedToCollection財產,有標記爲「不變」 1個對象。當我做entityA.EntityB [0] .MarkAsDeleted()時,狀態不會被設置爲'已刪除'並移動到ObjectsRemovedFromCollection集合。它完全被刪除。我再次檢查並將ChangeTrackingEnabled設置爲True,對於實體A和實體B.是否有這個原因不起作用的原因?因此,我不能刪除子實體並將更改持久化到數據庫。

回答

2

這似乎是一個錯誤。在該方法中RecordRemovalFromCollectionProperties我改變了這一切只是返回到該行:

if(((IObjectWithChangeTracker) value).ChangeTracker.State == ObjectState.Added) 
    return; 

這個固定我是有問題的。

0

雖然通過更改此生成的代碼很危險。 RecordRemovalFromCollectionProperties方法的作用是查看是否有添加的對象再次被刪除(最終狀態=沒有添加或刪除實體,添加和刪除「相互排斥」,你會看到......?)。這就是爲什麼還有一個RecordAdditionToCollectionProperties,它對我之前解釋的內容進行了「反向」檢查。

現在,隨着您對ChangeTracker的此方法的更改,您可能會發送帶有添加的EntityB和刪除的EntityB(它們是相同的實例)的EntityA。這可以由用戶或代碼完成。

我不知道對象上下文是否允許這個。但它至少有點不夠用。發送更新的EntityA它說的對象上下文(context.ApllyChanges(EntityA))加入該EntityB以及剛結束,mwoah也刪除此相同EntityB;)

我在這個領域有一些經驗,所以如果您還有其他問題...

我認爲最初的問題有一個原因,但你的解決方案有點粗糙。

相關問題