2017-09-05 1 views
1

Entités:Automapper crée soudainement objet imbriqué

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:

public class EntityDto 
{ 
    public int Id { get; set; } 
} 

public class UserDto : EntityDto 
{ 
    public string Name { get; set; } 

    public int? CompanyId { get; set; } 
} 

donc je veux la carte User à UserDto comme User.Company == null=>UserDto.CompanyId == null et vice versa.

C'est mon Automapper configuration:

Mapper.Initialize(configuration => 
{ 
    configuration 
     .CreateMap<User, UserDto>() 
     .ReverseMap(); 
}); 

Cela fonctionne très bien:

[Fact] 
public void UnattachedUserMapTest() 
{ 
    // Arrange 
    var user = new User { Company = null }; 

    // Act 
    var userDto = Mapper.Map<User, UserDto>(user); 

    // Assert 
    userDto.CompanyId.Should().BeNull(); 
} 

mais ce test échoue:

[Fact] 
public void UnattachedUserDtoMapTest() 
{ 
    // Arrange 
    var userDto = new UserDto { CompanyId = null }; 

    // Act 
    var user = Mapper.Map<UserDto, User>(userDto); 

    // Assert 
    user.Company.Should().BeNull(); 
} 

Détails:

Expected object to be <null>, but found 

Company 
{ 
    Id = 0 
    Name = <null> 
} 

ne fonctionne pas pour moi:

... 
.ReverseMap() 
.ForMember(user => user.Company, opt => opt.Condition(dto => dto.CompanyId != null)); 

et bien que celle (juste par exemple):

... 
.ReverseMap() 
.ForMember(user => user.Company, opt => opt.Ignore()); 

Pourquoi créer Automapper objet imbriqué et comment puis-je l'empêcher?

Répondre

1

Ce bit "soudainement" est drôle :)

configuration.CreateMap<User, UserDto>().ReverseMap().ForPath(c=>c.Company.Id, o=>o.Ignore()); 

Vous avez une MapFrom par défaut avec COMPANYID et qui est appliqué dans le sens inverse. Pour plus de détails, voir this et quelques autres problèmes similaires.

Dans la prochaine version (sur MyGet au moment), vous pourrez également utiliser

configuration.CreateMap<User, UserDto>().ReverseMap().ForMember(c=>c.Company, o=>o.Ignore()); 
+0

Je suppose que je ne suis pas en mesure d'utiliser la cartographie conditionnelle pour les membres? Ignorer est toujours ok pour moi, mais je veux juste savoir) –

+0

Vous voulez dire [ceci] (https://github.com/AutoMapper/AutoMapper/issues/2298)? –

+0

Oui, exactement. Sympa de le voir sera bientôt disponible. –