【发布时间】:2020-01-22 16:50:03
【问题描述】:
在我当前带有实体框架的 .net core mvc 项目中,我使用带有 DI 的 automapper。在我的编辑方法中,我需要使用视图模型更新域模型。这是我使用自动映射器的地方。但是视图模型只包含域模型的几个属性。应该保留其他属性,但是,当我应用 _context.Update(modelToSubmit); 时,它们被设置为 null 或默认值如何仅更新域模型中我实际想要更改的字段(视图模型中的那些)?
它目前在这个项目中所做的方式是在视图模型中添加所有属性,并在视图中使用@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() 方法,但它仍然会抛出此错误。
【问题讨论】:
-
我通常会从数据库中获取现有模型,使用视图模型中的相关字段手动更新它,然后保存。虽然我知道这种方法并没有真正使用 automapper..
-
是的,我一直在这样做,但它有点烦人和乏味,特别是如果模型有很多字段。
-
如果您经常使用相同的视图模型,那么您可以将手动映射提取到一个可重用的辅助函数中,这样会稍微不那么乏味。
标签: c# asp.net-mvc asp.net-core automapper