C# 自动映射:按属性命名约定展开不起作用
我想将我的数据结构扁平化为dto 我的源类(简化)如下所示:C# 自动映射:按属性命名约定展开不起作用,c#,.net-core,automapper,C#,.net Core,Automapper,我想将我的数据结构扁平化为dto 我的源类(简化)如下所示: public class DeliveryNote { public DeliveryNoteNested DeliveryNoteNestedInstance { get; set; } public string VehicleNo { get; set; } } public class DeliveryNoteNested { public string No { get; set; } pu
public class DeliveryNote
{
public DeliveryNoteNested DeliveryNoteNestedInstance { get; set; }
public string VehicleNo { get; set; }
}
public class DeliveryNoteNested
{
public string No { get; set; }
public string PlantNo { get; set; }
}
我的dto(也简化了)像
然后我进行映射:
Mapper.Initialize(cfg => cfg.CreateMap<DeliveryNote, DeliveryNoteDto>());
var source = new DeliveryNote
{
VehicleNo = "VehicleNo20",
DeliveryNoteNestedInstance = new DeliveryNoteNested
{
No = "42",
PlantNo = "PlantNo10"
}
};
var dto = Mapper.Map<DeliveryNoteDto>(source);
Mapper.Initialize(cfg=>cfg.CreateMap());
var source=新交货通知单
{
VehicleNo=“VehicleNo20”,
DeliveryNoteNestedInstance=新DeliveryNoteNested
{
否=“42”,
PlantNo=“PlantNo10”
}
};
var dto=Mapper.Map(源);
最后,我希望我的属性No和PlantNo通过命名约定填写在dto中,但它们不是
当我这样做的时候
Mapper.Initialize(cfg => cfg.CreateMap<DeliveryNote, DeliveryNoteDto>()
.ForMember(dest => dest.No, opt => opt.MapFrom(src => src.DeliveryNoteNestedInstance.No))
.ForMember(dest => dest.PlantNo, opt => opt.MapFrom(src => src.DeliveryNoteNestedInstance.PlantNo)));
Mapper.Initialize(cfg=>cfg.CreateMap()
.FormMember(dest=>dest.No,opt=>opt.MapFrom(src=>src.DeliveryNoteNestedInstance.No))
.ForMember(dest=>dest.PlantNo,opt=>opt.MapFrom(src=>src.DeliveryNoteNestedInstance.PlantNo));
它可以工作,但在我的真实类中,我有将近50个属性,我希望尽可能避免使用这种锅炉板代码。基本约定是
public class DeliveryNoteDto
{
public int Id { get; set; }
public string DeliveryNoteNestedInstanceNo { get; set; }
public string DeliveryNoteNestedInstancePlantNo { get; set; }
public string VehicleNo { get; set; }
}
你也可以使用
CreateMap(typeof(DeliveryNote), typeof(DeliveryNoteDto))
.AfterMap((s, d) => Mapper.Map(s.DeliveryNoteNested, d));
映射父对象时,可以映射foreach中的子对象。在这种情况下,可以使用反射映射每个子对象property@RossBush:你能用一些示例代码解释一下你的评论吗?@SemenMiroshnichenko-不管怎样,我以为你的dto是作为父/子创建的。与dto不同的是您的poco对象,与我上面的评论相反。但是,如果您创建的域对象尽可能接近数据库模式,减去不重要的字段,那么这并不能回答您的问题。它使跨越边界变得不那么麻烦:)对于AutoMapper 8.0.0,我必须在示例代码中用DeliveryNoteNestedInstance替换DeliveryNoteNested,否则我会出现编译错误。之后,Dto中的所有字段都用“.DeliveryNoteNested”填充,也用类型名称作为值。所以它不起作用。和以前一样,我需要用DeliveryNoteNestedInstance替换DeliveryNoteNested,当我这样做时,我得到一个异常“Unmapped members was find Unmapped properties:Id VehicleNo”,在这种情况下,我相信您的命名不匹配。如果内部对象的命名不同,则需要使用MapMember分别映射它们。例如:source.Vehicle=>dest.nestedObj.VehicleId不能在不使用MapMemberYes的情况下进行映射我可以这样做(正如我在问题中提到的),但我一直在寻找更优雅的解决方案(否则我必须以这种方式映射我的所有50个属性)。
CreateMap(typeof(DeliveryNote), typeof(DeliveryNoteDto))
.AfterMap((s, d) => Mapper.Map(s.DeliveryNoteNested, d));