意外行为:映射嵌套集合

本文关键字:嵌套 集合 映射 意外 | 更新日期: 2023-09-27 18:17:00

我正在尝试使用Mapper映射嵌套集合的类型。地图(从);我遇到了很多问题。

一开始我遇到了一个问题目标字段中的一个属性在源类型

中不存在
 int Id {get; set; }

总是被设置为0,不管我使用什么member map (Ignore()或UseDestinationValue())。我发现我必须为集合类型创建一个映射:

Mapper.CreateMap(List<source>, List<destination>)

这导致id字段没有被设置为0,但是现在源集合中的所有值不再复制到目标集合中。下面是我的意思的一个例子:

public class TestModel
{
    public virtual List<NestedTestModel> Models { get; set; }
}
public class NestedTestModel
{
    public int Value { get; set; }
}
public class TestEntity
{
    public int Id { get; set; }
    public virtual List<NestedTestEntity> Models { get; set; }
}
public class NestedTestEntity
{
    public int Id { get; set; }
    public int Value { get; set; }
}
[Test]
public void TestMappingFromCalibrationModelToCalibrationModelEntity()
{
    Mapper.CreateMap<TestModel, TestEntity>()
        .ForMember(x => x.Id, x => x.UseDestinationValue());
    Mapper.CreateMap<NestedTestModel, NestedTestEntity>()
        .ForMember(x => x.Id, x => x.UseDestinationValue())
        .ForMember(x => x.Value, y => y.MapFrom(z => z.Value));
    Mapper.CreateMap<List<NestedTestModel>, List<NestedTestEntity>>();
    TestModel from = new TestModel();
    from.Models = new List<NestedTestModel>
    {
        new NestedTestModel { Value = 3 }
    };
    TestEntity to = new TestEntity
    {
        Models = new List<NestedTestEntity>
        {
            new NestedTestEntity { Id = 1, Value = 2 }
        }
    };
    var actual = Mapper.Map<TestModel, TestEntity>(from, to);
    // this only works if Mapper.CreateMap<List<NestedTestModel>, List<NestedTestEntity>>();
    Assert.AreEqual(1, actual.Models[0].Id);
    // Results in 
    // Expected: 3
    // But was:  2
    Assert.AreEqual(3, actual.Models[0].Value); 
}

意外行为:映射嵌套集合

AutoMapper支持集合

Mapper.CreateMap(List<source>, List<destination>);

不需要

你所需要的只是:

Mapper.CreateMap<sourceNested, destinationNested>();
Mapper.CreateMap<source, destination>();

然后这样映射:

var res = Mapper.Map<IEnumerable<source>, IEnumerable<destination>>(source);

TestModel映射到TestEntity时,TestEntity.Id始终0,因为它的类型是int, int的默认值是0