实体:
public class Entity
{
public int Id { get; set; }
}
public class User : Entity
{
public string Name { get; set; }
public Company Company { get; set; }
}
public class Company : Entity
{
public string Name { get; set; }
}
DTO' S:
public class EntityDto
{
public int Id { get; set; }
}
public class UserDto : EntityDto
{
public string Name { get; set; }
public int? CompanyId { get; set; }
}
所以我想将User
映射到UserDto
,例如User.Company == null
=>
UserDto.CompanyId == null
,反之亦然。
这是我的 Automapper 配置:
Mapper.Initialize(configuration =>
{
configuration
.CreateMap<User, UserDto>()
.ReverseMap();
});
这很好用:
[Fact]
public void UnattachedUserMapTest()
{
// Arrange
var user = new User { Company = null };
// Act
var userDto = Mapper.Map<User, UserDto>(user);
// Assert
userDto.CompanyId.Should().BeNull();
}
但是这个测试失败了:
[Fact]
public void UnattachedUserDtoMapTest()
{
// Arrange
var userDto = new UserDto { CompanyId = null };
// Act
var user = Mapper.Map<UserDto, User>(userDto);
// Assert
user.Company.Should().BeNull();
}
详细说明:
Expected object to be <null>, but found
Company
{
Id = 0
Name = <null>
}
不适合我:
...
.ReverseMap()
.ForMember(user => user.Company, opt => opt.Condition(dto => dto.CompanyId != null));
以及那(仅举例):
...
.ReverseMap()
.ForMember(user => user.Company, opt => opt.Ignore());
为什么Automapper会创建嵌套对象?如何防止它?
答案 0 :(得分:1)
那个“突然”有点可笑:)
configuration.CreateMap<User, UserDto>().ReverseMap().ForPath(c=>c.Company.Id, o=>o.Ignore());
您有一个带有CompanyId的默认MapFrom,反之亦然。有关详细信息,请参阅this和其他一些类似问题。
在下一个版本中(目前在MyGet上)你也可以使用
configuration.CreateMap<User, UserDto>().ReverseMap().ForMember(c=>c.Company, o=>o.Ignore());