2

我有以下两个类(为简洁起见,省略了许多属性)。

服务层 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 类中吐出。

4

2 回答 2

2

首先,您可能应该为这些东西使用属性,而不是字段。但是,我怀疑这是您问题的一部分。

string与其尝试从to创建地图ContactKey,不如尝试将地图的这一部分从一个TicketFlag到另一个:

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

我认为这可以防止您遇到错误。

于 2013-09-26T19:20:07.473 回答
1

AutoMapper 抱怨您没有默认构造函数,因为 AutoMapper 需要创建目标类的空实例,然后才能将值映射到它。它不能调用你的 ContractKey 的参数化构造函数——它会怎样?

在这种情况下,它可能看起来很简单,如果构造函数如下所示:

public ContracktKey(string keyValue){}

但是如果它有两个参数呢?

public ContracktKey(string keyValue, string otherValue){}

它怎么知道把值放在哪里?如果您只提供一个字符串怎么办?

我认为最好听从其他人的建议并映射这两个TicketFlag对象。

于 2013-09-26T19:54:36.123 回答