背景:我正在开发一个网络服务,我希望允许具有空字段的输入表示“不进行更新”。输入对象与数据库模型非常相似但不完全相同,因此我们使用自动映射器来进行转换。
因此,在更新的情况下,我希望能够获取现有值,使用它们覆盖输入中的任何空字段,然后保存它以执行整个更新。 那么有没有办法让自动映射器仅在目标字段为空时才将值放入目标中?
是的,可以,但您可能不想经历这个麻烦。为此,您需要为要执行此操作的对象上的每个字段都有一个自定义映射处理程序(您也许可以在相同类型的属性之间共享自定义处理程序,但我不能100% 确定,无需查看我的一些旧代码)。
我最近使用 Automapper 5.2.0 的前提条件解决了我自己的问题。
CreateMap<Foo, Foo>()
.ForAllMembers(opt => opt.Precondition(
new Func<Foo, bool>( foo =>
if (opt.DestinationMember == null) return true;
return false;
)
));
这会查看所有目标成员,并且在查看源成员之前首先查看目标成员是否为空。 (如果它不为空,那么它永远不会查看源代码。)
这应该有帮助
CreateMap<Foo, Foo>()
.ForAllMembers(opts => opts.Condition((source, destination, sourceMember) => sourceMember != null));
归功于https://stackoverflow.com/users/470005/sergey-berezovskiy, 在这里找到了答案https://stackoverflow.com/a/43947731/6049226