简单的自动化示例

时间:2013-12-17 13:32:17

标签: 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; }      
}

映射器

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

Mapper.CreateMap<Group, GroupDto>();
Mapper.CreateMap<GroupDto, Group>();

Group映射到GroupDto时,您是否必须在内部将User映射到UserDto,因为List<User>中的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)))

这是对的吗?

2 个答案:

答案 0 :(得分:26)

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; }      
}

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

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

4-如果您想要映射,请致电:

Mapper.Map<GroupDto>(groupEntity);

希望有所帮助。

答案 1 :(得分: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; }      
}

for:

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<UserDTO> Users { get; set; }      
}

你只需要:

  

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)))

类似于:

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)))

这尚未经过测试,但这个想法就在这里......