忽略 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
:
- 将
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));
- 指定
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());
- 重命名
Country
构造函数中的 id
参数。
// public Country(string id) { Id = id; }
public Country(string countryId) { Id = countryId; }
DisableConstructorMapping
所有地图。
DisableConstructorMapping(); // Add this
CreateMap<Country, CountryDto>().Ignore(x => x.Id);
CreateMap<CountryDto, Country>().Ignore(x => x.Id);
- 排除具有名为
id
. 的任何参数的构造函数
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);
我有以下简单的 类 和忽略 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
:
- 将
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));
- 指定
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());
- 重命名
Country
构造函数中的id
参数。
// public Country(string id) { Id = id; }
public Country(string countryId) { Id = countryId; }
DisableConstructorMapping
所有地图。
DisableConstructorMapping(); // Add this
CreateMap<Country, CountryDto>().Ignore(x => x.Id);
CreateMap<CountryDto, Country>().Ignore(x => x.Id);
- 排除具有名为
id
. 的任何参数的构造函数
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);