忽略 AutoMapper 中的目标成员不起作用

Ignore destination member in AutoMapper not working

我有以下简单的 类 和忽略 Id 字段的映射。
我注意到,当我从 Eto/Dto 映射到实体时,.Ignore() 不起作用,我不知道其背后的原因。

我正在使用最新的 ABP 4.4。

public class Country : Entity<string>
{
    public Country() {}
    public Country(string id) { Id = id; }
}

public class CountryDto : EntityDto<string> { }

CreateMap<Country, CountryDto>().Ignore(x => x.Id); // id ignored
CreateMap<CountryDto, Country>().Ignore(x => x.Id); // id not ignored

我测试中的映射代码:

var country1 = new Country("XX");
var dto1 = ObjectMapper.Map<Country, CountryDto>(country1);
        
var dto2 = new CountryDto() { Id = "XX" };
var country2 = ObjectMapper.Map<CountryDto, Country>(dto2);

我也尝试忽略普通的 AutoMapper 长格式而不是 ABP 的 Ignore 扩展。

AutoMapper 根据源成员映射到目标构造函数。

有几种方法可以在目标构造函数中忽略 id

  1. id 构造函数参数映射到 null.
   CreateMap<Country, CountryDto>().Ignore(x => x.Id);
// CreateMap<CountryDto, Country>().Ignore(x => x.Id);
   CreateMap<CountryDto, Country>().Ignore(x => x.Id).ForCtorParam("id", opt => opt.MapFrom(src => (string)null));
  1. 指定 ConstructUsing.
   CreateMap<Country, CountryDto>().Ignore(x => x.Id);
// CreateMap<CountryDto, Country>().Ignore(x => x.Id);
   CreateMap<CountryDto, Country>().Ignore(x => x.Id).ConstructUsing(src => new Country());
  1. 重命名 Country 构造函数中的 id 参数。
// public Country(string id) { Id = id; }
   public Country(string countryId) { Id = countryId; }
  1. DisableConstructorMapping 所有地图。
DisableConstructorMapping(); // Add this
CreateMap<Country, CountryDto>().Ignore(x => x.Id);
CreateMap<CountryDto, Country>().Ignore(x => x.Id);
  1. 排除具有名为 id.
  2. 的任何参数的构造函数
ShouldUseConstructor = ci => !ci.GetParameters().Any(p => p.Name == "id"); // Add this
CreateMap<Country, CountryDto>().Ignore(x => x.Id);
CreateMap<CountryDto, Country>().Ignore(x => x.Id);

参考:https://docs.automapper.org/en/v10.1.1/Construction.html