Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射:按属性命名约定展开不起作用_C#_.net Core_Automapper - Fatal编程技术网

C# 自动映射:按属性命名约定展开不起作用

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

我想将我的数据结构扁平化为dto

我的源类(简化)如下所示:

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