Ограничить сопоставление с существующими объектами назначения - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть проект с использованием AutoMapper и Entity Framework Core, который я только что обновил, чтобы использовать новые обнуляемые ссылочные типы C # 8 ( Обнуляемые ссылочные типы @ .NET Conf 2019 ).

Следуя совету Microsoft о использовании обнуляемых ссылочных типов с EF Core , я создал конструкторы для своих классов сущностей с параметрами для необходимых свойств, чтобы они не могли быть нулевыми.

У меня естьследующий тип сущности и тип патча, используемые, когда я хочу обновить описание сущности:

public class DocType {
    public string Code { get; set; }
    public string Description { get; set; }
    public int? SortIndex { get; set;}

    // I added this after the C#8 upgrade
    public DocType(string code, string description) {
        Code = code;
        Description = description;
    }
}

public class ModifyDocTypePatch {
    public string? Description { get; set; }
    public int SortIndex { get; set; }
}

Теперь мне нужно иметь возможность сопоставить DocType с ModifyDocTypePatch и обратно.Предостережение заключается в том, что при сопоставлении с DocType мне нужно разрешить только сопоставление с существующим DocType, а не создание нового.

До моего обновления у меня был этот профиль сопоставления:

public class DocTypeProfile : Profile {
    public DocTypeProfile() {
        CreateMap<DocType, ModifyDocType>()
            .ReverseMap();
    }
}

Это работало нормально, но после добавления конструктора это не так.AutoMapper требует конструктор без параметров.Я думал, что мог бы использовать метод .ConstructUsing(), чтобы сказать autopper, чтобы он использовал новый конструктор при отображении обратно из ModifyDocTypePatch, но это не работает, потому что конструктор требует кода, а патч не имеет его.

Есть ли способ создать сопоставление, которое применяется только к существующим объектам назначения?Чтобы я мог сделать:

var docType = new DocType("code", "description");
var patch = new ModifyDocTypePatch { Description = "new description" };
var mapped = _mapper.Map(patch, docType);

, но не:

var patch = new ModifyDocTypePatch { Description = "new description" };
var mapped = _mapper.Map<ModifyDocTypePatch, DocType>(patch);

Обновление

Благодаря совету от Lucian я смог придумать работу-около.Я добавил частный конструктор без параметров в DocType.Казалось, это удовлетворяет требованиям конструктора AutoMappers.Я также добавил DisableConstructorMapping() в свой профиль, потому что новый (параметризованный) конструктор приводил к отображению некоторых свойств, которые я отмечал, которые должны быть проигнорированы.

Хотя это выполнимо, что мне не нравится в этомЭто необходимость изменить модели моего домена только для размещения AutoMapper.Если у кого-то есть лучшее решение, я бы с удовольствием его услышал!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...