C# 我可以使用AutoMapper在两个不可变的字段之间进行映射吗?
我有以下两个类(为简洁起见,省略了许多属性) 服务层POCO:C# 我可以使用AutoMapper在两个不可变的字段之间进行映射吗?,c#,.net,automapper,C#,.net,Automapper,我有以下两个类(为简洁起见,省略了许多属性) 服务层POCO: public class TicketFlag { public ContactKey ContactKey; } LINQ到SQL生成的POCO: public class TicketFlag { public string ContactKey; } 在“服务调用->数据库保存”中尝试使用AutoMapper在这两个调用之间映射时,我遇到以下异常: Exception of type 'AutoMa
public class TicketFlag
{
public ContactKey ContactKey;
}
LINQ到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().ConvertUsing(s=>ContactKeySerializer.Serialize(s));
但我仍然收到投诉,因为ContactKey没有默认构造函数
有没有办法让AutoMapper不使用默认构造函数进行属性映射?实际上,仅仅在ContactKey上映射属性是不够的——我需要让它调用构造函数,或者从我的ContactKeySerializer类中得到spit。首先,您可能应该针对这些内容,而不是字段。然而,我怀疑这是你问题的一部分 您可以尝试将这部分映射从一个
TicketFlag
映射到另一个
Mapper.CreateMap<LINQtoSQL.TicketFlag, Service.Layer.TicketFlag>()
.ForMember(dest => dest.ContactKey,
mem => mem.ResolveUsing(src => ContactKeySerializer.Serialize(src.ContactKey)));
Mapper.CreateMap()
.ForMember(dest=>dest.ContactKey,
mem=>mem.resolvesusing(src=>ContactKeySerializer.Serialize(src.ContactKey));
我认为这可以防止出现错误。AutoMapper抱怨您没有默认构造函数,因为AutoMapper需要创建目标类的空实例,然后才能将值映射到它。它不能调用ContractKey的参数化构造函数-它将如何调用
在这种情况下,如果构造函数如下所示,它可能看起来很简单:
public ContracktKey(string keyValue){}
但如果它有两个参数呢
public ContracktKey(string keyValue, string otherValue){}
它怎么知道把价值放在哪里?如果您只提供了一个字符串呢
我认为最好按照其他人的建议映射这两个TicketFlag
对象。你确定这不是因为它们是字段而不是属性吗?它们是字段,谢谢你指出。现在编辑以澄清。不过,我不确定为什么这很重要。也许我需要RTFM:)?你能显示Mapper.Map调用吗,特别是你认为使用CreateMap的那个调用?它对我很有效。您是否从示例代码中删除了导致问题的内容?@Tim S有一些帮助器类缓存了我删除的映射。可能是那里有什么东西。我查一下。还将尝试您的答案(使用ResolveUsing)-以前从未使用过那个答案。我理解为什么它需要一个默认的构造函数。在这种情况下,甚至尝试调用它都没有意义(我不希望为调用者提供默认的ctor,他们真的需要使用参数化的ctor)。你说得对,我应该用对方的答案。很好的解释。
public ContracktKey(string keyValue, string otherValue){}