使用 HasDefaultValueSql 的 AutoMapper

AutoMapper utilizing HasDefaultValueSql

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

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

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

我也在使用 AutoMapper 映射实体。

我的映射实体class -

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 设置来保留默认值?

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 设置中使用该常量。

希望对您有所帮助。