0

我知道这个问题在另一个线程中得到了回答。我尝试了建议的方法,但仍然无法正常工作。

这是我的实体和模型映射...

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 和 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:实体实例“doc”不是代理,所以不是代理可能导致不正确的映射。

4

1 回答 1

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());

});

欲了解更多详情...

https://github.com/AutoMapper/AutoMapper.Collection

于 2017-10-31T18:16:17.077 回答