AutoMapper忽略不处理实体更新

时间:2017-05-03 14:54:12

标签: c# entity-framework-6 automapper-6

我知道这个问题在另一个帖子中得到了回答。我尝试了所建议但仍无法正常工作。

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

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;不是代理,所以它不是代理可能导致不正确的映射。

1 个答案:

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

});

更多细节......

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