因为我在 Github 上的问题已关闭,所以我在这里打开一个线程。
来源类型:
public class ATest1
{
public int Id { get; set; }
}
目的地类型:
public class ATest2
{
public int Id { get; set; }
public DateTime DateCreated { get; set; }
}
映射配置:
CreateMap<ATest, ATest2>()
.ForMember(x => x.DateCreated, opt => opt.MapFrom((src, dest)
=>
{
return dest.Id <= 0 ? DateTime.UtcNow : dest.DateCreated;
}))
.EqualityComparison((source, destination) => source.Id == destination.Id);
版本:
自动映射器:12.0.1
Automapper.Collection:9.0.0
EF 核心:8.0.3
预期行为
此映射是为了映射上面定义的实体列表而提供的。我的期望是,当我检查它是否是现有实体(是否有数据库 ID)时,根据此条件,我可以保留现有项目的 DateCreated 值不变,而只需为新项目设置 DateCreated 值。
实际行为
但是映射列表后,现有项目的 DateCreated 值始终设置为 DateTime.MinValue。我进行了调试,发现我没有获取 DateTime 的目标对象值。
我已经尝试过
.Condition()
和 .PreCondition()
方法,但同样的情况发生了。
见下图:
这是一个错误还是我做错了什么?
如果有人能解释这里的行为那就太好了。
重要提示: 只是要提一下,如果我对单个对象进行映射,它会按预期工作。
花了一些时间后,我找到了答案。 我忘了补充
添加集合映射器()
文档中建议的配置根方法: https://github.com/AutoMapper/AutoMapper.Collection?tab=readme-ov-file#how-to-add-to-automapper
这就是重新创建列表但不知何故只有日期时间值未正确映射的原因。
添加此行后,已对现有集合完成映射,而无需重新创建它,因此满足了预期。