使用 AutoMapper 将许多分层对象映射到 DTO
Map a dozen of hierarchical objejcts with AutoMapper to DTOs
我有一个包含 12 个 entity framework 个对象的层次结构。
我还为每个实体创建了一个 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.
这不可能吗?我是否必须为 class 中的复杂 classes 设置额外的映射?
不,您必须在配置中为每个 DTO 创建一个映射。
假设您的 Person.cs
、Address.cs
、Car
和 Entities
中的用户
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;}
}
所以你还有 PersonDTO
、AddressDTO
和 CarDTO
例如
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;}
}
您的 class 定义了所有映射。
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();
只要属性的名称相同,它们就应该映射。
如果您有继承层次结构,则使用此方法 https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance. You need to register mapping for each pair of types and call .Map only once. If you have nested objects, then use this one https://github.com/AutoMapper/AutoMapper/wiki/Nested-mappings。同样,只有一个 .Map 调用。如果您张贴了一些对象层次结构的示例,就更容易分辨了。
总而言之,您必须为每种 'complex' 类型进行映射。
我有一个包含 12 个 entity framework 个对象的层次结构。
我还为每个实体创建了一个 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.
这不可能吗?我是否必须为 class 中的复杂 classes 设置额外的映射?
不,您必须在配置中为每个 DTO 创建一个映射。
假设您的 Person.cs
、Address.cs
、Car
和 Entities
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;}
}
所以你还有 PersonDTO
、AddressDTO
和 CarDTO
例如
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;}
}
您的 class 定义了所有映射。
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();
只要属性的名称相同,它们就应该映射。
如果您有继承层次结构,则使用此方法 https://github.com/AutoMapper/AutoMapper/wiki/Mapping-inheritance. You need to register mapping for each pair of types and call .Map only once. If you have nested objects, then use this one https://github.com/AutoMapper/AutoMapper/wiki/Nested-mappings。同样,只有一个 .Map 调用。如果您张贴了一些对象层次结构的示例,就更容易分辨了。
总而言之,您必须为每种 'complex' 类型进行映射。