我有以下两个类(为简洁起见,许多属性都被省略了。)
服务层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类中获取spit。
答案 0 :(得分:2)
首先,对于这些事情,你可能应该using properties,而不是字段。但是,我怀疑这是你问题的一部分。
您可以尝试将地图的这一部分从一个string
转换为另一个地图,而不是尝试创建从ContactKey
到TicketFlag
的地图:
Mapper.CreateMap<LINQtoSQL.TicketFlag, Service.Layer.TicketFlag>()
.ForMember(dest => dest.ContactKey,
mem => mem.ResolveUsing(src => ContactKeySerializer.Serialize(src.ContactKey)));
我认为这可以防止你得到的错误。
答案 1 :(得分:1)
AutoMapper抱怨您没有默认构造函数,因为AutoMapper需要先创建目标类的空实例,然后才能将值映射到它。它无法调用ContractKey的参数化构造函数 - 它会如何?
在这种情况下,如果构造函数看起来像这样,它可能看起来很简单:
public ContracktKey(string keyValue){}
但如果它有两个参数呢?
public ContracktKey(string keyValue, string otherValue){}
怎么知道把价值放在哪里?如果你只提供了一个字符串怎么办?
我认为最好遵循他人的建议并映射两个TicketFlag
对象。