Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射条件实体映射_C#_Entity Framework_Automapper_Automapper 3 - Fatal编程技术网

C# 自动映射条件实体映射

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

我有一个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 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转换回实体?我想我必须用尤里安的方法来做,对吗?