gpt4 book ai didi

c# - AutoMapper 条件实体映射

转载 作者:行者123 更新时间:2023-11-30 12:27:19 25 4
gpt4 key购买 nike

我有一个数据库实体,它存储这样的订单地址......

enter image description here

我有这样的 BLL 类...

public class DeliveryAddress
{
public string Id { get; set; }
public string PersonyName { get; set; }
public string CompanyName { get; set; }
public List<string> AddressLines { get; set; }
public string Zip { get; set; }
public string City { get; set; }
public string CountryCode { get; set; }
}

还有一个这样的类...

public class InvoiceAddress
{
public string Id { get; set; }
public string PersonyName { get; set; }
public string CompanyName { get; set; }
public List<string> AddressLines { get; set; }
public string Zip { get; set; }
public string City { get; set; }
public string CountryCode { get; set; }
}

并且我想根据 AddressType 列将 EF 实体映射到上述类。任何人都可以向我解释如何做到这一点吗?

更新

如果 addressType 是“Delivery”,我想映射到 OR.DeliveryAddress,如果 addressType 是“Invoice”,我想映射到 OR.InvoiceAddress

到目前为止,我已经能够做到这一点,但我不知道如何在实体映射级别上应用条件...

Mapper.CreateMap<OrderAddress, OR.DeliveryAddress>()
.ForMember(d => d.City, o => o.MapFrom(s => s.city))
.ForMember(d => d.CompanyName, o => o.UseValue(string.Empty))
.ForMember(d => d.CountryCode, o => o.MapFrom(s => s.countryCode))
.ForMember(d => d.Id, o => o.MapFrom(s => s.id))
.ForMember(d => d.PersonyName, o => o.MapFrom(s => s.name))
.ForMember(d => d.Zip, o => o.MapFrom(s => s.zip));

更新 2

与@Yuliam 讨论后 Here is the Fiddle我可以为我的问题想出...

最佳答案

您可以为对象创建一个客户映射器。而且您不必使用 ForMember 指定每个属性,因为如果区别只是大写/小写(除非 PersonName),默认情况下 AutoMapper 映射属性名称时不区分大小写。

为对象创建自定义映射器。

public class AddressConverter : ITypeConverter<OrderAddress, object>
{
public object Convert(ResolutionContext context)
{
var o = context.SourceValue as OrderAddress;
if (o == null) return null;

if (o.addressType == "Delivery") return Mapper.Map<OR.DeliveryAddress>(o);
if (o.addressType == "Invoice") return Mapper.Map<OR.InvoiceAddress>(o);
return null;
}
}

然后定义映射器。

Mapper.CreateMap<OrderAddress, OR.DeliveryAddress>()
.ForMember(d => d.PersonyName, o => o.MapFrom(s => s.name));
Mapper.CreateMap<OrderAddress, OR.InvoiceAddress>()
.ForMember(d => d.PersonyName, o => o.MapFrom(s => s.name));
Mapper.CreateMap<OrderAddress, object>().ConvertUsing<AddressConverter>();

用法。

var orderAddressDto = Mapper.Map<object>(orderAddress);

实际的 orderAddressDto 类型将基于 addressType。如果您有 OR.DeliveryAddressOR.InvoiceAddress 的接口(interface)或基类,那将是更强类型的。然后用接口(interface)/基类替换对象类型。

关于c# - AutoMapper 条件实体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25657876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com