У меня есть проект с использованием 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.Если у кого-то есть лучшее решение, я бы с удовольствием его услышал!