我知道这个问题在另一个帖子中得到了回答。我尝试了所建议但仍无法正常工作。
这是我的实体和模型映射...
cfg.CreateMap<DocumentAmountModel, InputDocumentData>()
.ForMember(d => d.Amounts, o => o.MapFrom(s => s.Amounts));
儿童金额的映射
cfg.CreateMap<ItemAmountModel, Amount>()
//Ignore the Keys for update
.ForMember(a => a.Id, o => o.Ignore())
.ForMember(a => a.ItemId, o => o.Ignore())
我试图忽略实体中的PK和FK更新模型中的内容。
在服务层上 - 实体加载来自Db的数据,然后调用映射器以更新除FK&amp;之外的所有属性。 PK如下。
var doc = _docDataR.GetAll()
.Where(d => d.Id==1)
.SingleOrDefault<InputDocumentData>();
Mapper.Map<DocumentAmountModel, InputDocumentData>(model, doc);
令我惊讶的是,Amount.Id和Amount.ItemId总是在子Amounts上更新为0。我错过了哪些明显的东西?
PS:实体实例&#34; doc&#34;不是代理,所以它不是代理可能导致不正确的映射。
答案 0 :(得分:0)
当涉及到子集合时,AutoMapper会重新创建实体(目标)集合。为了指示AutoMapper使用现有集合,配置必须按如下方式完成......
步骤1:调用AddCollectionMappers() - 这是我错过的。
Mapper.Initialize(cfg =>
{
cfg.AddCollectionMappers(); //This is must
});
步骤2:使用EqualityComparison方法指示AM如何将源集合中的项目与目标匹配。
Mapper.Initialize(cfg =>
{
cfg.AddCollectionMappers();
cfg.CreateMap<DocumentAmountModel, InputDocumentData>()
.ForMember(d => d.Amounts, o => o.MapFrom(s => s.Amounts));
cfg.CreateMap<AmountModel, Amount>()
.EqualityComparison((model, e) => model.Code == e.Code);
});
步骤3:忽略任何不应从模型
更新的PK,FK等属性Mapper.Initialize(cfg =>
{
cfg.AddCollectionMappers();
cfg.CreateMap<DocumentAmountModel, InputDocumentData>()
.ForMember(d => d.Amounts, o => o.MapFrom(s => s.Amounts));
cfg.CreateMap<AmountModel, Amount>()
.EqualityComparison((model, e) => model.Code == e.Code)
.ForMember(e => e.Id, o => o.Ignore());
});
更多细节......