В моем текущем. net core mvc проекте с каркасом сущностей я использую Autopper с DI. В моем методе редактирования мне нужно обновить модель домена, используя viewmodel. Это где я использую Autopper. Но viewmodel содержит только несколько свойств domainmodel. Другие свойства должны быть сохранены, однако они устанавливаются в ноль или по умолчанию, когда я применяю _context.Update(modelToSubmit);
Как я могу обновить только те поля в модели домена, которые я на самом деле хочу изменить (те, которые находятся в модели представления)?
В настоящее время это делается в этом проекте путем добавления всех свойств в viewmodel и использования тега @Html.HiddenFor
в представлении, что я считаю плохой практикой и от которого я хочу избавиться.
У меня есть одна строка кода для сопоставления:
DomainModel model = _mapper.Map<DomainModel>(viewModel);
Редактировать: У меня сейчас (на основе ответа ниже):
DatabaseModel originalRecord = _unitOfWork.DatabaseModel.Get(id);
var mappedModel = _mapper.Map<ViewModel>(originalRecord);
var newDto = _mapper.Map<ViewModel, DataBaseModel>(returnedViewModel, originalRecord);
originalRecord = _mapper.Map<ViewModel, DatabaseModel>(mappedModel);
_unitOfWork.DatabaseModel.Update(originalRecord);
Мой файл сопоставления:
CreateMap<ViewModel, DatabaseModel>()
.IgnoreAllPropertiesWithAnInaccessibleSetter()
.ForPath(dest => dest.ID, opt => opt.Ignore())
.ForPath(dest => dest.Deadline, opt => opt.Ignore())
.ForPath(dest => dest.RecordCreated, opt => opt.Ignore())
.ForPath(dest => dest.Status, opt => opt.Ignore())
.ReverseMap();
Когда я сохраняю модель на веб-сайте, я получаю эту ошибку:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: ожидается, что операция базы данных повлияет на 1 ряд (ы), но фактически затронули 0 ряд (а).
Запрос на получение originalRecord
имеет метод AsNoTracking()
, но он все равно выдает эту ошибку.