简单的自动化示例

Dav*_*vid 33 c# wcf linq-to-entities automapper

我很难理解如何映射某些对象.请回答一些关于这个简单示例的问题.

示例代码

class User
{
    private int id;
    private string name;
}

class Group
{
    private int id;
    private string name;
    private List<User> users;
}

[DataContract]
public class UserDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }      
}

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<User> Users { get; set; }      
}
Run Code Online (Sandbox Code Playgroud)

地图集

Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>();

Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>();
Run Code Online (Sandbox Code Playgroud)

映射Group到时GroupDto,是否必须映射UserUserDto内部,因为List<User>in Group包含未映射Users?如果是这样,你怎么做?我的猜测是

Mapper.CreateMap<Group, GroupDto>()
    .ForMember(g => g.id, opt => opt.Ignore());
    .ForMember(g => g.name, opt => opt.Ignore());
    .ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<Group, UserDto>(u)))
Run Code Online (Sandbox Code Playgroud)

它是否正确?

Oma*_*ani 29

1-将GroupDto更改为:

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<UserDTO> Users { get; set; }      
}
Run Code Online (Sandbox Code Playgroud)

2-创建映射:

Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>(); // Only if you convert back from dto to entity

Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>(); // Only if you convert back from dto to entity
Run Code Online (Sandbox Code Playgroud)

3-这就是全部,因为自动映射器会自动映射List<User>List<UserDto>(因为它们具有相同的名称,并且已经存在从用户到UserDto的映射)

4-当您想要映射时,请致电:

Mapper.Map<GroupDto>(groupEntity);
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 我想看到 AutoMapper 5 的更新示例。我认为其中大部分不再有效。 (2认同)

Min*_*nus 5

正如@stuartd所说,如果你改变:

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<User> Users { get; set; }      
}
Run Code Online (Sandbox Code Playgroud)

用于:

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<UserDTO> Users { get; set; }      
}
Run Code Online (Sandbox Code Playgroud)

您只需要 :

Mapper.CreateMap()

否则,改变

Mapper.CreateMap<Group, GroupDto>()
    .ForMember(g => g.id, opt => opt.Ignore());
    .ForMember(g => g.name, opt => opt.Ignore());
    .ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<Group, UserDto>(u)))
Run Code Online (Sandbox Code Playgroud)

对于这样的事情:

Mapper.CreateMap<Group, GroupDto>()
    .ForMember(g => g.id, opt => opt.Ignore());
    .ForMember(g => g.name, opt => opt.Ignore());
    .ForMember(g => g.Users, opt => opt.MapFrom(u => Mapper.Map<List<User>>(g.Users)))
Run Code Online (Sandbox Code Playgroud)

这还没有经过测试,但这个想法就在这里......