使用AutoMapper将十几个分层对象映射到DTO

时间:2015-05-22 12:53:25

标签: c# automapper automapper-3

我有12个实体框架对象的层次结构。

我也为每个实体创建了一个DTO。

我想通过电汇发送DTO。

我必须使用DTO方法。

您如何使用Automapper映射此数量的对象?

我必须使用12次AutoMapper.Map方法吗?

更新

我现在收到此错误:

{"Missing type map configuration or unsupported mapping.\r\n\r\n....
I have an NumberEntity.cs with 3 complex properties which I want to map to

a NumberDTO.cs with 3 complex properties.

这不可能吗?我是否必须为类中的复杂类设置额外的映射?

2 个答案:

答案 0 :(得分:1)

如果您有继承层次结构,请使用此方法https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance。您需要为每对类型注册映射,并且只调用 .Map 一次。如果您有嵌套对象,请使用此https://github.com/AutoMapper/AutoMapper/wiki/Nested-mappings。同样,只有一个 .Map 调用。如果您发布了一些对象层次结构的示例,则更容易分辨。

总而言之,您必须为每个“复杂”类型设置映射。

答案 1 :(得分:0)

不,您必须在配置中为每个DTO创建映射。

假设您Person.cs

中有Address.csCarEntities和用户
public class User
{
public int UserId {get;set;}
public string UserName {get;set;}

public PersonDTO Person {get;set;}
}

public class Person
{
public int PersonID {get;set;}
public string Name {get;set;}

public Address Address {get;set;}
public Car Car {get; set;}

}

因此,您还拥有PersonDTOAddressDTOCarDTO

e.g。

    public class UserDTO
    {
    public int UserId {get;set;}
    public string UserName {get;set;}

// HERE IF YOU HAVE:
// public PersonDTO MyPerson {get;set;}
// IT WILL NOT MAP
// Property Names should match

    public PersonDTO Person {get;set;}

    }


public class PersonDTO
{
   public int PersonID {get;set;}
   public string Name {get;set;}

   public AddressDTO Address {get;set;}
   public CarDTO Car {get;set;}

}

您定义了所有映射的类。

public class MapperConfig
{
  public static void CreateMappings()
  {
        Mapper.CreateMap<UserDTO, Entities.User>().ReverseMap();
        Mapper.CreateMap<PersonDTO, Entities.Person>().ReverseMap();

        Mapper.CreateMap<AddressDTO, Entities.Address>().ReverseMap();
        Mapper.CreateMap<CarDTO, Entities.Car>().ReverseMap();
  }
}

然后在你的代码中:

UserDTO user = Mapper.Map<UserDTO>(context.Users.First(s => s.UserId == 1));

映射列表:

List<UserDTO> users = Mapper.Map<IEnumerable<UserDTO>>(context.Users).ToList();

只要属性名称相同,就应该映射。