意外行为AutoMapper映射嵌套集合

时间:2015-10-09 13:33:33

标签: c# entity-framework mapping automapper

我尝试使用Mapper.Map(from,to)映射具有嵌套集合的类型;我遇到了很多问题。

最初我遇到的问题是我的目标字段上的属性在我的源类型中不存在

 int Id {get; set; }
无论我使用什么ForMember地图(Ignore()或UseDestinationValue()),

始终设置为0。我发现我必须为我的集合类型创建一个映射:

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

}

1 个答案:

答案 0 :(得分:0)

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,{的默认值为{ {1}}是int