将我的 DTO 映射到我的数据库实体后的空值

Null values after mapping my DTO to my Database Entity

我在使用 AutoMapper 将 POST 操作上的 DTO 映射到我的数据库实体时遇到问题,因为我的数据库实体包含对其他数据库实体的多个引用,所以我在“WrapperDTO”中也使用了多个 DTO ”。但是在我的酒店模型 class 上映射 Country/Address 引用后 null.I 无法弄清楚为什么,对我来说 DTO -> 模型的映射似乎是正确的。将不胜感激。

这是我的模型和 DTO:

酒店型号:

public class Hotel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public double Rating { get; set; }

        [ForeignKey(nameof(AddressId))]
        public int AddressId { get; set; }
        public Address Address { get; set; }


        [ForeignKey(nameof(CountryId))]
        public int CountryId { get; set; }
        public Country Country { get; set; }

    }

酒店 DTO:

public class CreateHotelDto : BaseHotelDto
{
    public CreateAddressDto AddressDto { get; set; }

    public CreateCountryDto CountryDto { get; set; }
}

public class BaseHotelDto
{
    public string Name { get; set; }
    public double Rating { get; set; }

}

然后我的地址模型:

public class Address
{
    public int Id { get; set; }
    public string StreetAddress { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
}

我的地址 DTO:

public class CreateAddressDto : BaseAddressDto
{

}

public abstract class BaseAddressDto
{
    public string StreetAddress { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
}

最后是我的国家模型:

[Index(nameof(Country.Name), IsUnique = true)]
public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string CountryCode { get; set; }
    public string ShortName { get; set; }


    public virtual IList<Hotel> Hotels { get; set; }
}

我的国家/地区 DTO:

[Index(nameof(CreateCountryDto.Name), IsUnique = true)]
public class CreateCountryDto : BaseCountryDto
{
    [Required]
    public string CountryCode { get; set; }
}

public abstract class BaseCountryDto
{
    [Required]
    public string Name { get; set; }
    public string ShortName { get; set; }
}

我的“MapperConfig”中也有这段代码-Class 将 DTO 映射到我的模型:

 public MapperConfig()
        {
            #region CountryDbContext

            CreateMap<CreateCountryDto, Country>().ReverseMap();
            CreateMap<UpdateCountryDto, Country>().ReverseMap();
            CreateMap<CountryDetailsDto, Country>().ReverseMap();
            CreateMap<GetCountryDto, Country>().ReverseMap();


            #endregion

            #region AddressDbContext

            CreateMap<GetAddressDto, Address>().ReverseMap();
            CreateMap<UpdateAddressDto, Address>().ReverseMap();
            CreateMap<CreateAddressDto, Address>().ReverseMap();

            #endregion

            #region HotelDbContext

            CreateMap<HotelDetailsDto, Hotel>().ReverseMap();
            CreateMap<GetHotelDto, Hotel>().ReverseMap();
            CreateMap<CreateHotelDto, Hotel>().ReverseMap();
            CreateMap<UpdateHotelDto, Hotel>().ReverseMap();


            #endregion
        }

当然,我使用这个注入了 AutoMapper 服务:

builder.Services.AddAutoMapper(typeof(MapperConfig));

在我的控制器中,我映射了 CreateHotelDto(其中 CreateHotelDto 是通过参数提供的)-> 酒店:

var mappedHotel = _mapper.Map<Hotel>(createHotelDto);

我使用以下 Dummy-JSON 作为端点的数据:

{
  "name": "Hotel Cirrus Shake",
  "rating": 3.0,
  "addressDto": {
    "streetAddress": "87 North Bear Hill St.",
    "city": "New York City",
    "state": "NY",
    "zipCode": "11756"
  },
  "countryDto": {
    "name": "USA",
    "shortName": "US",
    "countryCode": "840"
  }
}

HotelDto 的属性“Name”和“Rating”已正确映射,但是 AddressDto/CountryDto 未正确映射到其对应的模型,它们只是空值,Id 为 0,但这很好,因为它们是 SQL-Server 上的自动递增值,因此不需要。

这也是我的调试器的屏幕截图,其中包含有关这些对象的相关信息:

像下面这样更改您的MapperConfig

public class MapperConfig : Profile
{
    public MapperConfig()
    {
        CreateMap<CreateCountryDto, Country>().ReverseMap();

        CreateMap<CreateAddressDto, Address>().ReverseMap();

        CreateMap<CreateHotelDto, Hotel>()
            .ForPath(a=>a.Address,o=>o.MapFrom(dto=>dto.AddressDto))   //add this...
            .ForPath(a=>a.Country, o=>o.MapFrom(dto=>dto.CountryDto))  //add this...
            .ReverseMap();
    }
}

结果: