【问题标题】:AutoMapper utilizing HasDefaultValueSqlAutoMapper 利用 HasDefaultValueSql
【发布时间】:2019-04-06 06:05:33
【问题描述】:

在我的 Entity Framework Core 2.2 API 项目中,我构建了上下文。因为它代表我的数据库中的数据,所以我得到类似的条目 -

entity.Property(e => e.Active)
    .IsRequired()
    .HasDefaultValueSql("((1))");

其中Active 是必需的,默认值为 1。

我也在使用 AutoMapper 映射实体。

我的 MappingEntity 类 -

public class MappingEntity : Profile
{
    public MappingEntity()
    {
        CreateMap<MemberUpdate, Member>();
    }
}

这会将 ViewModel MemberUpdate 映射到我的数据库对象 Member

我的控制器中似乎丢失了默认值 -

public ActionResult Account(int id, [FromBody]MemberUpdate updatedMember)
{
    Member member = _memberRepository.GetById(id);
    //HERE MY MEMBER OBJECT IS CORRECT AND `ACTIVE` HAS IT'S DEFAULT VALUE

    member = _mapper.Map<Member>(updatedMember);
    //HERE MY MEMBER OBJECT IS INCORRECT AND THE ACTIVE FIELD DOES NOT SHOW THE DEFAULT VALUE

    //proceed to save back to the database
}

是否有 AutoMapper 设置来保留默认值?

【问题讨论】:

    标签: c# automapper .net-core-2.2


    【解决方案1】:

    AutoMapper 无法保留您的默认值,因为它甚至不知道它的存在。

    .HasDefaultValueSql("((1))"); 是 EntityFramework 在 构造对象时使用的设置,但在这种情况下 AutoMapper 正在构造对象,因此信息会丢失。

    可以做的是将一些自定义逻辑应用到您的映射中,以便在之后添加默认值。它看起来像下面这样:

    CreateMap<MemberUpdate, Member>()
        .AfterMap((memberUpdate, member) =>
             member.Active = memberUpdate.Active == default(int) ? 1 : memberUpdate.Active); 
    

    这只是在MemberMemberUpdate 之间进行默认映射,然后之后Member 分配您想要的默认值。

    或者,您可以更改模型以在其中包含默认值,而不是在外部执行该分配,例如:

    public int Active { get; } = 1;
    

    虽然我怀疑该选项对您有用,因为您希望 EF 为您处理。我建议将硬编码的1 剥离为某个常量,然后在 AutoMapper 映射和 EF 设置中使用该常量。

    希望对您有所帮助。

    【讨论】:

    • 我可能不太清楚。该映射是否强制映射后的值?如果传入的视图模型将其设置为不同的值怎么办?
    • 在没有看到您的模型的情况下,我不得不不幸地做出一些假设。其中之一是您的传入模型实际上没有这样的属性,但似乎我错了。你能告诉我当传入的视图模型确实有值时与它没有时的预期行为是什么?
    • 当传入模型具有该属性时,映射它。如果尚未在传入模型上设置该属性,请使用数据库默认值
    • 好的,我刚刚在帖子中编辑了映射代码来处理该用例。希望对您有所帮助!
    猜你喜欢
    • 2012-03-14
    • 2018-08-09
    • 2020-04-22
    • 2021-07-14
    • 2019-07-28
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多