簡體   English   中英

我可以使用AutoMapper在兩個不可變的字段之間進行映射嗎?

[英]Can I use AutoMapper to map between two fields which are immutable?

我有以下兩個類(為簡潔起見,省略了許多屬性)。

服務層POCO:

public class TicketFlag
{
    public ContactKey ContactKey;
}

LINQ to SQL生成的POCO:

public class TicketFlag
{
    public string ContactKey;    
}

嘗試使用AutoMapper在服務調用->數據庫保存這兩者之間映射時,出現以下異常:

Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
 ---> System.ArgumentException: Type 'ContactKey' does not have a default constructor

ContactKey沒有故意的默認構造函數。 基本上,它需要一個字符串和一個對象列表,並且可以對自身進行序列化/反序列化。

我嘗試過創建一個映射函數(它是相反的),如下所示:

Mapper.CreateMap<string, ContactKey>().ConvertUsing(s => ContactKeySerializer.Serialize(s));

但是我仍然在抱怨,因為ContactKey沒有默認的構造函數。

有沒有一種方法可以使AutoMapper不使用默認構造函數進行屬性映射? 確實,僅在ContactKey上映射屬性是不夠的-我需要讓它調用構造函數,或者從我的ContactKeySerializer類中吐出來。

首先,您可能應該將屬性用於這些東西,而不是字段。 但是,我懷疑這是您的問題的一部分。

與其嘗試創建從stringContactKey的映射, ContactKey嘗試將這一部分從一個TicketFlag映射到另一個TicketFlag

Mapper.CreateMap<LINQtoSQL.TicketFlag, Service.Layer.TicketFlag>()
 .ForMember(dest => dest.ContactKey,
 mem => mem.ResolveUsing(src => ContactKeySerializer.Serialize(src.ContactKey)));

我認為這樣可以防止您遇到錯誤。

AutoMapper抱怨您沒有默認的構造函數,因為AutoMapper需要先創建目標類的空實例,然后才能將值映射到它。 它無法調用您的ContractKey的參數化構造函數-它將如何?

在這種情況下,如果構造函數如下所示,則看起來很簡單:

public ContracktKey(string keyValue){}

但是,如果有兩個參數怎么辦?

public ContracktKey(string keyValue, string otherValue){}

它怎么知道將價值放在哪里? 如果您只提供一個字符串怎么辦?

我認為最好聽從別人的建議,並映射兩個TicketFlag對象。

暫無
暫無

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

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