我正在使用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));
我玩过Ignore
和GlobalIgnore
,似乎找不到一种解决方案,可以为更新的项目维护源属性的值,但为添加的项目使用目标属性的值。
我该如何实现?