c# - 我可以使用 AutoMapper 在两个不可变字段之间进行映射吗?

标签 c# .net automapper

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

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

最佳答案

首先,你可能应该是using properties对于这些东西,而不是领域。但是,我怀疑这就是您问题的一部分。

您可以尝试将映射的这一部分从一个 TicketFlag 制作为从 stringContactKey 的映射,而不是尝试创建从另一个:

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

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

关于c# - 我可以使用 AutoMapper 在两个不可变字段之间进行映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19036270/

相关文章:

c# - DateTime.Now 与 DateTime.UtcNow 用法的区别

.net - Entity Framework 数据上下文中没有带有连接字符串的构造函数

c# - 通过 Automapper 将枚举属性映射到数组

c# - 自动映射器:有条件地更改列表中项目的值

c# - 在 gridview 中隐藏选择按钮

C# : Get type parameter at runtime to pass into a Generic method

c# - 具有嵌套值 : Cannot create instance of type because it is either abstract or an interface 的 IOptionsSnapshot

C#: "(subtype)data"和 "data as subtype"类型转换之间有什么区别吗?

c# - .NET 基元和类型层次结构,为什么要这样设计?

c# - AutoMapper:如何从 String 解析 Int 并可能根据数据类型创建规则?