【发布时间】:2021-12-23 17:47:18
【问题描述】:
我在尝试忽略目标属性时遇到了麻烦
源类:
public class ClassDto
{
public int Id { get; set; }
}
目的地类:
public class ClassModel
{
public int Id { get; set; }
public IList<string> ListString { get; set; }
}
例子:
public class Program
{
static void Main(string[] args)
{
var dto = new ClassDto { Id = 1 };
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<ClassDto, ClassModel>().
ForMember(i => i.ListString, opt => opt.DoNotUseDestinationValue());
});
config.AssertConfigurationIsValid();
var mapper = config.CreateMapper();
var model = mapper.Map<ClassDto, ClassModel>(dto);
}
}
不幸的是 config.AssertConfigurationIsValid();引发异常:
$exception {"\n找到未映射的成员。查看下面的类型和成员。\n添加自定义映射表达式,忽略,添加自定义 解析器,或修改源/目标类型\n如果没有匹配 构造函数,添加无参数 ctor,添加可选参数,或映射所有 构造函数 参数\n================================================= ====\r\nClassDto -> ClassModel(目标成员列表)\r\nAutoMapperFoo.ClassDto -> AutoMapperFoo.ClassModel(目标成员列表)\r\n\r\n未映射 属性:\r\nListString\r\n"} AutoMapper.AutoMapperConfigurationException
我无法理解为什么,我明确地通过 DoNotUseDestinationValue 忽略 ListString
提前致谢
【问题讨论】:
-
UseDestinationValue()并不意味着忽略映射成员。这意味着不要使用新对象对其进行初始化(如果已映射,则映射到现有值)。 AutoMapper 仍会尝试映射该成员。如果没有匹配的源成员映射,验证将抛出异常,因为UseDestinationValue()表示无论映射是否存在都保留成员的现有值。令人困惑的命名选择,但这就是它的工作原理。
标签: c# .net mapping automapper