簡體   English   中英

在實體框架中使用更改跟蹤撤消/重做

[英]Undo / Redo with change tracking in Entity Framework

我正在嘗試基於具有POCO實體的實體框架實現撤消/重做功能。 因此,在我要跟蹤的每次更改之后,我將ChangeTracker稱為對實體的任何修改,而我將ObjectStateManger稱為對關系的更改(即導航屬性)。 我將所有更改與當前值和先前值一起存儲,以便能夠在歷史記錄中來回移動。

我現在的問題是,對於具有導航屬性和相應外鍵的實體,如果將引用的實體新添加到DbContext,則這兩個值將無法正確同步。

澄清一下:說我有這些課程:

public class EntityFilter
{
    [Key]
    public Guid ID { get; set; }

    public virtual ICollection<EntityConnection> IsSource { get; set; }

    public virtual ICollection<EntityConnection> IsSink { get; set; }

    //other stuff
}

public class EntityConnection
{
    [Key]
    public Guid SinkFilterID { get; set; }

    [ForeignKey("SinkFilterID")]
    public virtual EntityFilter Sink { get; set; }

    public Guid SourceFilterID { get; set; }

    [ForeignKey("SourceFilterID")]
    public virtual EntityFilter Source { get; set; }

    //more stuff
}

EntityConnection基本上是過濾器之間的多對多關系,但實際上它包含更多字段,這就是為什么我不能擺脫它。 我也想盡可能地籠統,而不依賴於我們的實際數據模型。

如果添加新的過濾器,然后將其連接到現有過濾器(也可能是新過濾器),則會出現問題。 取消連接仍然可以,但是當我嘗試重做時,我的程序將崩潰。 我可以在還原的連接中看到,外鍵SinkFilterID具有正確的值,但Sinknull (對於源,可能會發生同樣的情況,具體取決於連接的方向)。 手動調用DetectChanges沒什么區別。 在兩個現有的過濾器之間添加連接(即它們已經存儲在數據庫中)沒有問題。

對於此類型的新連接,檢測到的更改僅包含ChangeTracker實體更改,而ObjectStateManger沒有關系更改。 我猜這是因為該關系已經由外鍵處理,該外鍵包含在PreviousValues的屬性中。

我讀過EntityState.Added狀態中的實體獲取臨時鍵,並且不完全支持對它們的更改跟蹤。 我能以某種方式使它工作嗎?

我嘗試與MetadataWorkspace進行檢查,如果我更新的實體具有外鍵和相應的導航屬性,並且在這種情況下,可以通過反射手動進行更新,但是我不確定實際上必須檢查哪些數據。

有沒有辦法使外鍵和導航屬性與添加的實體保持同步? 還是您有什么建議我可以嘗試?

非常感謝你。

我最終得到的是:

我保留了所有添加實體的單獨列表。 然后,當我必須還原由外鍵支持的導航屬性時,我會搜索該列表並手動設置導航屬性。 最困難的部分是弄清楚如何在數據模型中檢入是否完全需要此修補程序,以及如何找到相應屬性的名稱。

整個系統仍存在一些缺陷,無法實現最大的通用性,但對於我們需要的功能來說效果很好。

暫無
暫無

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

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