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,是否必须映射User到UserDto内部,因为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)
希望有所帮助.
正如@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)
这还没有经过测试,但这个想法就在这里......