意外行为:映射嵌套集合
本文关键字:嵌套 集合 映射 意外 | 更新日期: 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
。