【发布时间】:2020-07-22 03:15:35
【问题描述】:
我们在 .net 核心中使用 automapper 将视图模型映射到 dto。对于 datetime,我们希望将 utc 保存到我们的数据库中,但对于用户,我们希望显示本地时区。 这与这样的 ConvertUsing 配合得很好:
CreateMap<CreateAgendaItemViewModel, AgendaItemDto>()
.ForMember(dest => dest.StartDateTime, opt => opt.ConvertUsing(new ToUtcTimeConverter()))
.ReverseMap()
.ForMember(dest => dest.StartDateTime, opt => opt.ConvertUsing(new ToLocalTimeConverter()))
到目前为止,如果您总是想更改时间,那就太好了。但是,可能只设置了日期而不设置时间(因为它是全天事件),我们希望将时间保持为如下所示:2020-04-09 00:00:00.0000000。我们在模型中有一个布尔值,指示它是否确实是一整天的事件。我们如何调节皈依者?
我们已经尝试过使用条件的 MapFrom,但它不能进行转换。我们也试过这个,但它最终没有被映射,或者被映射到 UTC 时间。
.ForMember(dest => dest.StartDateTime, opt => { opt.Condition(src => !src.AllDayEvent); opt.ConvertUsing(new ToUtcTimeConverter()); })
【问题讨论】:
-
试试
PreCondition。检查the execution plan。 -
@LucianBargaoanu PreCondition 如何解决这个问题?她只想在满足条件时使用 ValueConverter,否则使用默认映射。我不知道这在 AutoMapper 中是否可行。
-
PreCondition将允许您完全跳过转换器。如果这不是重点,您可以控制分配的内容,所以就这样做吧。 -
@LucianBargaoanu 好的,但是前提条件跳过了一个属性,它根本不会被映射。这就是问题所在,只有当源对象的另一个属性为真时,它才应该使用自定义 ValueConverter 进行映射。否则它应该使用默认转换但不跳过该属性。我在 Automapper 文档中找不到这样做的方法。
-
你需要一个值解析器。
标签: c# datetime asp.net-core-mvc automapper