Automapper突然创建嵌套对象

时间:2017-09-05 10:42:56

标签: c# .net automapper

实体:

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会创建嵌套对象?如何防止它?

1 个答案:

答案 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());