列表映射:当映射以日期时间属性为条件时,对于成员配置,目标对象日期时间属性始终具有默认值

问题描述 投票:0回答:1

因为我在 Github 上的问题已关闭,所以我在这里打开一个线程。

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()
方法,但同样的情况发生了。

见下图:

图1

图2

图3

图4

这是一个错误还是我做错了什么?

如果有人能解释这里的行为那就太好了。

重要提示: 只是要提一下,如果我对单个对象进行映射,它会按预期工作。

automapper
1个回答
0
投票

花了一些时间后,我找到了答案。 我忘了补充

添加集合映射器()

文档中建议的配置根方法: https://github.com/AutoMapper/AutoMapper.Collection?tab=readme-ov-file#how-to-add-to-automapper

这就是重新创建列表但不知何故只有日期时间值未正确映射的原因。

添加此行后,已对现有集合完成映射,而无需重新创建它,因此满足了预期。

© www.soinside.com 2019 - 2024. All rights reserved.