C# 自动映射条件实体映射
我有一个db实体,它像这样存储订单地址C# 自动映射条件实体映射,c#,entity-framework,automapper,automapper-3,C#,Entity Framework,Automapper,Automapper 3,我有一个db实体,它像这样存储订单地址 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 Z
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; }
}
我有这样的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; }
}
更新2
在与@Yuliam讨论后,我可以提出解决我的问题的方法…您可以创建一个到对象的客户映射器。此外,您不必使用
FormMember
指定每个属性,因为如果差异仅为大写/小写(除非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;
}
}
公共类地址转换器:ITypeConverter
{
公共对象转换(ResolutionContext上下文)
{
var o=context.SourceValue作为OrderAddress;
如果(o==null)返回null;
if(o.addressType==“Delivery”)返回Mapper.Map(o);
如果(o.addressType==“发票”)返回Mapper.Map(o);
返回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>();
Mapper.CreateMap()
.ForMember(d=>d.PersonyName,o=>o.MapFrom(s=>s.name));
Mapper.CreateMap()
.ForMember(d=>d.PersonyName,o=>o.MapFrom(s=>s.name));
CreateMap().ConvertUsing();
用法
var orderAddressDto = Mapper.Map<object>(orderAddress);
var orderAddressDto=Mapper.Map(orderAddress);
实际的
orderAddressDto
类型将基于addressType
。如果您有或.DeliveryAddress
和或.InvoiceAddress
的接口或基类,则该类型的强度更高。然后将对象类型替换为接口/基类。您可能需要尝试查看ResolveUsing
半伪代码,因为我不知道您的整个域模型是什么样子:
Mapper.CreateMap<OrderObject, OrderDto>()
.ForMember(x => x.Address, opt => opt.ResolveUsing(oo => oo.Type == Invoice ? oo.InvoiceAddress : oo.DeliveryAddress));
Mapper.CreateMap()
.ForMember(x=>x.Address,opt=>opt.resolvesusing(oo=>oo.Type==Invoice?oo.InvoiceAddress:oo.DeliveryAddress));
我在这里假设您有一个实际的订单实体,您正试图将其映射到只包含一个地址字段的“OrderDto”。如果地址类型为“Delivery”,是否要映射到
或.DeliveryAddress
,如果地址类型为“Invoice”,是否映射到或.InvoiceAddress
,你是对的…我不认为你应该在这里使用子类型,只是复制地址类型。AutoMapper没有用于此的工具。@GertArnold不使用子类型是什么意思?啊,它们不是子类型。好的,只需使用一个包含地址类型属性的类型。我在Order
实体中有List
,当我调用AutoMapper.Map(Order)时代码>。它会工作吗?@NaveedButt,您可以像这样映射属性var result=AutoMapper.map(order.OrderAddresses)代码>我使用了这个,但它不起作用,所以没有标记你的答案。我仍在寻找答案。我设法使用Linq
查询来完成这项工作,即手动填充对象…@NaveedButt,您是否直接映射了订单地址?还是从订单上?您是如何映射它的?@NaveedButt,在这个问题中没有map的用法,只是配置,让我再次澄清,您是使用了var orderAddressDto=Mapper.map(orderAddress)
还是var orderDto=Mapper.map(order.OrderAddresses)
还是var-addressedto=Mapper.map(order.OrderAddresses)
或其他什么?订单实体plus中有一个列表
。这是将实体转换为DTO的方法。如何将DTO转换回实体?我想我必须用尤里安的方法来做,对吗?