给出以下实体模型:
public class Location
{
public int Id { get; set; }
public Coordinates Center { get; set; }
}
public class Coordinates
{
public double? Latitude { get; set; }
public double? Longitude { get; set; }
}
...以及以下视图模型:
public class LocationModel
{
public int Id { get; set; }
public double? CenterLatitude { get; set; }
public double? CenterLongitude { get; set; }
}
LocationModel属性的命名使得从实体到模型的映射不需要自定义解析程序。
但是,从模型映射到实体时,需要以下自定义解析器:
CreateMap<LocationModel, Location>()
.ForMember(target => target.Center, opt => opt
.ResolveUsing(source => new Coordinates
{
Latitude = source.CenterLatitude,
Longitude = source.CenterLongitude
}))
这是为什么?是否有更简单的方法使AutoMapper根据视图模型中的命名约定构造新的Coordinate值对象?
更新
要回答第一条评论,viewmodel映射的实体没有什么特别之处:
CreateMap<Location, LocationModel>();
答案 0 :(得分:1)
修改强>
请参阅下面的评论帖子。这个答案实际上是针对相反的映射。
你做错了什么。您正确遵循惯例,因此映射应该无需任何解析器。
我刚试过这个测试,它通过了:
public class Location
{
public int Id { get; set; }
public Coordinates Center { get; set; }
}
public class Coordinates
{
public double? Latitude { get; set; }
public double? Longitude { get; set; }
}
public class LocationModel
{
public int Id { get; set; }
public double? CenterLatitude { get; set; }
public double? CenterLongitude { get; set; }
}
[Test]
public void LocationMapsToLocationModel()
{
Mapper.CreateMap<Location, LocationModel>();
var location = new Location
{
Id = 1,
Center = new Coordinates { Latitude = 1.11, Longitude = 2.22 }
};
var locationModel = Mapper.Map<LocationModel>(location);
Assert.AreEqual(2.22, locationModel.CenterLongitude);
}