AutoMapper, использующий HasDefaultValueSql - PullRequest
0 голосов
/ 05 апреля 2019

В моем проекте API Entity Framework Core 2.2 я выстроил контекст. Поскольку он представляет данные из моей базы данных, я получаю записи типа -

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 Ответ

2 голосов
/ 05 апреля 2019

AutoMapper не может сохранить ваше значение по умолчанию, потому что он даже не знает, что он существует.

.HasDefaultValueSql("((1))"); - это параметр, который EntityFramework использует, когда он создает объект, но в этом случае AutoMapper создает объект, так что информация теряется.

Однако то, что вы могли бы сделать, это применить некоторую пользовательскую логику к вашему отображению, чтобы впоследствии добавить значение по умолчанию. Это будет выглядеть примерно так:

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

Это просто выполняет сопоставление по умолчанию между Member и MemberUpdate, а затем впоследствии назначает значение по умолчанию, которое вы хотите для Member.

В качестве альтернативы, вы могли бы изменить свою модель так, чтобы она имела значение по умолчанию внутри нее, вместо того, чтобы выполнять это назначение внешне, как:

public int Active { get; } = 1;

Хотя я сомневаюсь, что этот вариант будет вам полезен, поскольку вы хотите, чтобы EF справился с этим за вас. Я бы предложил раздеть жестко закодированный 1 в константу и затем использовать эту константу в вашем отображении AutoMapper и в настройке EF.

Надеюсь, это поможет.

...