将我的 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();
}
}
结果:
我在使用 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();
}
}
结果: