實體框架,AutoMapper,處理實體更新

asp.net-mvc automapper c# entity-framework

我最近剛開始使用Entity Framework 1.0,並相信我開始感受到每個人都在談論的痛苦。我正在嘗試使用最佳實踐,因此我有一組DTO通過AutoMapper映射到我的實體和從我的實體映射。

真正的問題是當我試圖更新一個對象時。第一個問題是我找不到創建新實體的方法,從我的DTO傳輸數據,並且仍然讓實體ObjectContext意識到它已被更改。我使用了以下代碼:

public VideoDTO UpdateVideo(VideoDTO pVideo)
        {
            Video video = new Video();
            Mapper.Map(pVideo, video);
            context.Attach(video); //Successfully attaches
            context.ApplyPropertyChanges("Videos", video);  // no changes made as far as entity knows b/c it was attached in it's updated state
            context.SaveChanges(); //doesn't save the entity                
            return pVideo;
        }

然後我想,也許我需要先從數據庫中獲取實體,附加到上下文,在Mapper上調用Map方法,然後調用SaveChanges。我在這做了什麼:

    public VideoDTO UpdateVideo(VideoDTO pVideo)
    {
        Video video = context.Videos.Where(v => v.VideoId == pVideo.VideoId).FirstOrDefault();
        Mapper.Map(pVideo, video); //Error here: Can't change VideoId value on Video entity
        //context.Attach(video);
        //context.ApplyPropertyChanges("Videos", video);
        context.SaveChanges();

        return pVideo;
    }

現在我們得到了不允許更改屬性VideoId的可愛EF問題,因為它被Video實體上的EntityKey屬性使用。可愛。我已經設置了映射,以便當我從我的DTO映射到EF實體時,EntityKey屬性將獲得一個值。現在我需要一種方法來對該映射規則進行例外處理,但不知道從哪裡開始。我想我可以在這個方法中創建一個全新的映射規則,並將EntityKey和VideoId屬性設置為忽略,但這看起來非常草率。此外,我不確定此時創建的映射是否會成功。如果它覆蓋允許DTO將值映射到實體上的EntityKey的初始設置,那將以完全不同的方式適得其反。

誰有更好的主意?

一般承認的答案

AutoMapper

你的第一個問題是,據我所知,AutoMapper的設計並非來自DTO-> Entity only Entity-> DTO。這可能最近有所改變,所以我不太確定。有關automapper旨在執行的操作的詳細信息,請參閱此鏈接: 雙向映射的情況

PK映射

你說:“在這個方法中映射規則,並設置EntityKey和VideoId屬性被忽略,但這看起來很草率”

我認為這根本不是很邋。你真的不應該在持久化之後觸摸EntityKey / PK,並且可能應該以某種方式編寫其靜態性。

實體框架

“現在我們得到了不允許更改屬性VideoId的可愛的EF問題,因為它被視頻實體上的EntityKey屬性使用。很可愛。”

可愛? EF不會強迫您不更新PK。在生成的模型內部,您的密鑰的setter內部會進行屬性更改檢查。解決方案是更改生成的代碼。根據您的模型波動性,這可能不實用,但它是一種選擇。


熱門答案

嘗試映射到現有對象:

entity = Mapper.Map<MyDTO, NyEntity>(dto, entity); 

並將Ignore()保持在原位。

http://groups.google.com/group/automapper-users/browse_thread/thread/24a90f22323a27bc?fwc=1&pli=1



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因