集合中第一项与单个项之间的 AutoMapper 双向映射 属性
AutoMapper bi-directional mapping between first item in collection and single property
我正在使用 AutoMapper 6。请考虑以下内容 类:
public class Source
{
public FlattenableClass Flattenable { get; set; }
public List<EmailAddress> EmailAddresses { get; set; }
}
public class Destination
{
public string FlattenableProp1 { get; set; }
public string FlattenableProp2 { get; set; }
public MappedEmailAddress EmailAddress1 { get; set; }
}
其中 FlattenableClass
具有名为 Prop1
和 Prop2
的属性。如您所见,源有一个 EmailAddress
的集合,但目标只需要第一个,因为虽然我们的数据库允许电子邮件地址的集合,但应用程序将支持一个。我相信我可以像这样安排从 Source
到 Destination
的映射:
CreateMap<Source, Destination>()
.ForMember(d => d.EmailAddress1, opt => opt.ResolveUsing(s => s.EmailAddresses?.FirstOrDefault()));
但是,不出所料,如果我随后调用 ReverseMap()
,它不知道如何将 EmailAddress1
映射回 EmailAddresses
集合。有什么方法可以让它将 EmailAddress1
映射回 EmailAddress
并将其添加到 EmailAddresses
集合中吗?
我没有在 AutoMapper 中找到任何支持,但我找到了解决方法。我刚刚在源代码中创建了一个目标 属性 来为我完成工作:
public class Destination
{
public string FlattenableProp1 { get; set; }
public string FlattenableProp2 { get; set; }
public MappedEmailAddress EmailAddress1 { get; set; }
public List<MappedEmailAddress> EmailAddresses
{
get
{
List<MappedEmailAddress> emails = new List<MappedEmailAddress>();
if (EmailAddress1 != null) emails.Add(EmailAddress1);
return emails;
}
set
{
if (value == null || value.Count == 0)
EmailAddress1 = new MappedEmailAddress();
else
EmailAddress1 = value[0];
}
}
}
这让 AutoMapper 将 Source.EmailAddresses
映射到 Destination.EmailAddresses
,然后 Destination.EmailAddresses
完成映射到 EmailAddress1
的工作。这并不理想,因为我不得不公开电子邮件地址的集合 属性 除了自动映射器之外我不想被任何人使用,但它完成了。
我正在使用 AutoMapper 6。请考虑以下内容 类:
public class Source
{
public FlattenableClass Flattenable { get; set; }
public List<EmailAddress> EmailAddresses { get; set; }
}
public class Destination
{
public string FlattenableProp1 { get; set; }
public string FlattenableProp2 { get; set; }
public MappedEmailAddress EmailAddress1 { get; set; }
}
其中 FlattenableClass
具有名为 Prop1
和 Prop2
的属性。如您所见,源有一个 EmailAddress
的集合,但目标只需要第一个,因为虽然我们的数据库允许电子邮件地址的集合,但应用程序将支持一个。我相信我可以像这样安排从 Source
到 Destination
的映射:
CreateMap<Source, Destination>()
.ForMember(d => d.EmailAddress1, opt => opt.ResolveUsing(s => s.EmailAddresses?.FirstOrDefault()));
但是,不出所料,如果我随后调用 ReverseMap()
,它不知道如何将 EmailAddress1
映射回 EmailAddresses
集合。有什么方法可以让它将 EmailAddress1
映射回 EmailAddress
并将其添加到 EmailAddresses
集合中吗?
我没有在 AutoMapper 中找到任何支持,但我找到了解决方法。我刚刚在源代码中创建了一个目标 属性 来为我完成工作:
public class Destination
{
public string FlattenableProp1 { get; set; }
public string FlattenableProp2 { get; set; }
public MappedEmailAddress EmailAddress1 { get; set; }
public List<MappedEmailAddress> EmailAddresses
{
get
{
List<MappedEmailAddress> emails = new List<MappedEmailAddress>();
if (EmailAddress1 != null) emails.Add(EmailAddress1);
return emails;
}
set
{
if (value == null || value.Count == 0)
EmailAddress1 = new MappedEmailAddress();
else
EmailAddress1 = value[0];
}
}
}
这让 AutoMapper 将 Source.EmailAddresses
映射到 Destination.EmailAddresses
,然后 Destination.EmailAddresses
完成映射到 EmailAddress1
的工作。这并不理想,因为我不得不公开电子邮件地址的集合 属性 除了自动映射器之外我不想被任何人使用,但它完成了。