In an ASP.NET Core 1.1 Web API, I am trying to map an entity model to a DTO using AutoMapper.
The entity model:
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; } } }
and the 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; } } }
The mapping is done in a configuration file:
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)); } }
And the setting up of AutoMapper i Startup.cs:
public void ConfigureServices(IServiceCollection services) { var config = new AutoMapper.MapperConfiguration(cfg => { cfg.AddProfile(new AutoMapperProfileConfiguration()); }); var mapper = config.CreateMapper(); services.AddSingleton(mapper); }
In my controller action, I execute the mapping:
[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); }
It doesn't give an error, but all the properties in all the objects in the propertiesDto list are default values (NULL for objects and nullable types, FALSE for booleans, 0 for integers, etc.) Any ideas where I'm going wrong?