0

Dans une API Web ASP.NET Core 1.1, j'essaie de mapper un modèle d'entité à un DTO à l'aide d'AutoMapper.AutoMapper définissant toutes les propriétés sur NULL sur la destination

Le modèle d'entité:

namespace InspectionsData.Models 
{ 
    [Table("property")] 
    public class Property 
    { 

     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     [Column("property_id")] 
     public int? Id { get; set; } 

     [Column("show_inventory")] 
     public bool ShowInventory { get; set; } 

     [Column("latitude")] 
     public double? Latitude { get; set; } 

     [Column("longitude")] 
     public double? Longitude { get; set; } 

     [Column("property_type_id")] 
     public int? PropertyTypeId { get; set; } 
     [ForeignKey("PropertyTypeId")]   
     [Display(Name = "Property Type")] 
     public PropertyType PropertyType { get; set; } 

     [Column("inspection_frequency_id")] 
     public int? InspectionFrequencyId { get; set; } 
     [ForeignKey("InspectionFrequencyId")]   
     [Display(Name = "Inspection Frequency")] 
     public InspectionFrequency InspectionFrequency { get; set; } 

     [Column("group_id")] 
     public int? GroupId { get; set; } 
     [ForeignKey("GroupId")] 
     [Display(Name = "Group")] 
     public Group Group { get; set; } 

     [Column("added_by_id")] 
     public int? AddedById { get; set; } 
     [ForeignKey("AddedById")] 
     [Display(Name = "Added By")] 
     public virtual User AddedBy { get; set; } 

     [Column("added_date")] 
     [Display(Name = "Added Date")] 
     public DateTime AddedDate { get; set; } 

     [Column("deleted_by_id")] 
     public int? DeletedById { get; set; } 
     [ForeignKey("DeletedById")] 
     [Display(Name = "Deleted By")] 
     public virtual User DeletedBy { get; set; } 

     [Column("deleted_date")] 
     [Display(Name = "Deleted Date")] 
     public DateTime? DeletedDate { get; set; } 
    } 

et DTO:

namespace InspectionsData.DTOs 
{ 
    public class PropertyDto 
    { 
     public int? Id { get; set; } 
     public bool ShowInventory { get; set; } 
     public double? Latitude { get; set; } 
     public double? Longitude { get; set; } 
     public PropertyType PropertyType { get; set; } 
     public InspectionFrequency InspectionFrequency { get; set; } 
     public DateTime NextInspectionDate { get; set; } 
    } 
} 

Le mappage est effectué dans un fichier de configuration:

public class AutoMapperProfileConfiguration : Profile 
{ 
    public AutoMapperProfileConfiguration() 
    { 
     // Add as many of these lines as you need to map your objects 
     var map = CreateMap<Property, PropertyDto>(); 
     map.ForAllMembers(opt => opt.Ignore()); 
     map.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)); 
     map.ForMember(dest => dest.ShowInventory, opt => opt.MapFrom(src => src.ShowInventory)); 
     map.ForMember(dest => dest.Latitude, opt => opt.MapFrom(src => src.Latitude)); 
     map.ForMember(dest => dest.Longitude, opt => opt.MapFrom(src => src.Longitude)); 
     map.ForMember(dest => dest.PropertyType, opt => opt.MapFrom(src => src.PropertyType)); 
     map.ForMember(dest => dest.InspectionFrequency, opt => opt.MapFrom(src => src.InspectionFrequency)); 
    }  
} 

Et la mise en place de AutoMapper au démarrage .cs: ​​

public void ConfigureServices(IServiceCollection services) 
{ 
    var config = new AutoMapper.MapperConfiguration(cfg => 
    { 
     cfg.AddProfile(new AutoMapperProfileConfiguration()); 
    }); 

    var mapper = config.CreateMapper(); 
    services.AddSingleton(mapper); 
} 

Dans mon action du contrôleur, j'exécute la mise en correspondance:

[HttpGet] 
    public async Task<IActionResult> GetProperty() 
    { 
      var properties = _context.Property 
       .Include(t => t.PropertyType) 
       .Include(f => f.InspectionFrequency) 
       .Where(a => a.DeletedDate == null && a.GroupId == 1); 


      var propertiesDto = _mapper.Map<IEnumerable<PropertyDto>>(properties); 

      return Ok(propertiesDto); 
     } 

Il ne donne pas une erreur, mais toutes les propriétés de tous les objets de la liste propertiesDto sont des valeurs par défaut (NULL pour les objets et annulable types, FAUX pour les booléens, 0 pour les entiers, etc.) Des idées où je me trompe?

+0

Vous n'êtes pas en utilisant AM la façon dont il est conçu pour être utilisé et qui te avoir des ennuis. Voir [ici] (https://github.com/AutoMapper/AutoMapper/issues/1570#issuecomment-235515886). –

Répondre

4

C'est parce que la ligne suivante

map.ForAllMembers(opt => opt.Ignore()); 

est de laisser AM ignorer tous les mappings membres, y compris ceux que vous avez configurés explicitement.

utiliser simplement ForAllOtherMembers à la place:

map.ForAllOtherMembers(opt => opt.Ignore()); 
+0

Merci Ivan! Cela a fonctionné magnifiquement !! – user1900799