2016-07-22 88 views
0

我已經在這裏檢查了SO & Google對於類似的問題一般,但無法找到答案。這個代碼塊應該顯示我目前的情況:用AutoMapper重複使用現有的嵌套類實例

class Entity 
{ 
    Guid EntityId { get; set; } 
    string EntityName { get; set; } 
    NestedEntity Nested { get; set; } 
    // more domain methods 
} 

class NestedEntity 
{ 
    Guid NestedId { get; set; } 
    string NestedName { get; set; } 
    string NestedDescription { get; set; } 
    // more domain methods 
} 

class EntityDto 
{ 
    Guid EntityId { get; set; } 
    string EntityName { get; set; } 
    NestedEntityDto Nested { get; set; } 
} 

class NestedEntityDto 
{ 
    Guid NestedId { get; set; } 
    string NestedName { get; set; } 
    string NestedDescription { get; set; } 
} 

class MyMappingProfile : Profile 
{ 
    CreateMap<Entity, EntityDto>(); 
    CreateMap<NestedEntity, NestedEntityDto>(); 
} 

// that profile gets added to configuration, not shown here 
// IMapper is registered and injected as a dependency, not shown here 

EntityDto entityDto = GrabFromEntityFrameworkDbContext(); 

Entity entity = GrabChangesByUser(); 

mapper.Map<Entity, EntityDto>(entity, entityDto); 

所以,這是關於更新現有的項目,已經堅持在DB,由用戶所做的更改。一個EntityDto實例取自實體框架,其中DbContext將開始跟蹤EntityDtoNestedEntityDto。而Entity實例則包含用戶所做的更改,例如通過MVC/API PUT操作。

mapper.Map<Entity, EntityDto>(entity, entityDto);代表了一種快速(開發人員)的方式來將Entity深入克隆到現有的EntityDto實例中。

問題是第一級實體的實例實際上被重新使用(entityDto),但嵌套實體實例不會發生同樣的情況。從我目前的測試中,創建了一個NestedEntityDto的新實例並將其分配給EntityDto。這EFlus更改跟蹤,因爲現在有兩個嵌套的實體實例周圍具有相同的ID,等等

所以:我如何使AutoMapper不僅重複使用相同的實例不僅爲第一級目標對象,但也爲其嵌套屬性?有沒有辦法做到這一點?感謝所有

環境:ASP.NET核心1.0,EF核心1.0,AutoMapper 5.0.2,C#6

+0

您可能需要編寫自定義值解析器 –

+0

幸運的是麥剛寫上[Automapper和ASP.NET的文章核心1](https://lostechies.com/jimmybogard/2016/07/20/integrating-automapper-with-asp-net-core-di/) –

+0

感謝您的反饋。是的,我知道這個帖子和Net Core的集成不是一個問題,這是行得通的。你能詳細闡述你的價值解析器的想法嗎?我們已經使用一個將某個字段轉換爲另一個字段。但我看不出它是如何讓您重新使用頂層以下的現有實例的。 – superjos

回答

0

我的解決辦法,對於暫時​​基本上下降使用AutoMapper映射頂級類(Entity & EntityDto),同時繼續使用它來映射嵌套類。

在我的場景中,頂級類有幾個屬性,而有更多的嵌套類有自己的屬性,所以我的天平給我帶來了一個自定義映射器,用於手動映射頂級類並手動保存實例。這需要IMapper依賴關係來映射嵌套類,並在需要時重用現有實例。

當然,這種方法是有效的,因爲我只對頂級和第一嵌套級別的實例保留興趣。再說一遍,如果我不得不在下面的層次上保留實例,它將不起作用。

編輯:月後...
我在同樣的問題再次發生,這一次能夠在這裏至少找到SO一些可能的解決方法。對於未來的讀者: