利用HasDefaultValueSql的AutoMapper

时间:2019-04-05 16:24:20

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

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

1 个答案:

答案 0 :(得分:2)

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

希望有帮助。