如何配置Automapper.Collections以忽略更新项的源属性,但覆盖添加项的源属性?

时间:2019-05-22 00:42:52

标签: automapper

我正在使用AutoMapper.Collections将项目的源集映射到目标。

如果我有课

public class Foo
{
  public List<Bar> Bars;
}

public class Bar
{
  public string NaturalKey { get; set;}
  public Guid Id { get; protected set; } = Guid.NewGuid();
}

并且我使用类似于以下的映射器配置:

var config  = new MapperConfiguration(cfg =>
{
    cfg.AddCollectionMappers();
    cfg.CreateMap<Foo, Foo>();
    cfg.CreateMap<Bar, Bar>().EqualityComparison((x, y) => x.NaturalKey ==  y.NaturalKey);
});
var mapper = config.CreateMapper();

映射时,我希望源集合为更新的项目维护其源Id属性,但从目标中添加源的项目以维护目标的Id属性。

var fooA = new Foo { Bars = new List<Bar> { new Bar { NaturalKey = "1", new Bar { NaturalKey = "2" } } } };
var fooB = new Foo { Bars = new List<Bar> { new Bar { NaturalKey = "2", new Bar { NaturalKey = "3" } } } };
var bar2Id = fooA.Bars[1].Id;
var bar3Id = fooB.Bars[1].Id;
mapper.Map(fooB, fooA);
// How to achieve below?
// Assert.That(fooA.Bars[0].Id, Is.EqualTo(bar2Id));
// Assert.That(fooA.Bars[1].Id, Is.EqualTo(bar3Id));

我玩过IgnoreGlobalIgnore,似乎找不到一种解决方案,可以为更新的项目维护源属性的值,但为添加的项目使用目标属性的值。

我该如何实现?

0 个答案:

没有答案