Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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# 使用一个DTO自动映射嵌套类_C#_Asp.net Core 3.0_.net Core 3.0 - Fatal编程技术网

C# 使用一个DTO自动映射嵌套类

C# 使用一个DTO自动映射嵌套类,c#,asp.net-core-3.0,.net-core-3.0,C#,Asp.net Core 3.0,.net Core 3.0,因此,我正在与一些朋友建立一个webapp,在那里我将为它创建后端代码。我有几个模型,但只有一个模型是来自httppost 因此,对于传入的http post,我得到了: public class LanpartyDto { public Guid Id { get; set; } [Required] public string Name { get; set; } [Required] public DateTime Date { get;

因此,我正在与一些朋友建立一个webapp,在那里我将为它创建后端代码。我有几个模型,但只有一个模型是来自httppost

因此,对于传入的http post,我得到了:

    public class LanpartyDto
{
    public Guid Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public DateTime Date { get; set; }

    [Required]
    public string Description { get; set; }

    public Dictionary<DateTime, IList<string>> UsersAvailableForDate { get; set; }

}

public class Lanparty
{
    public Guid Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public DateTime Date { get; set; }

    [Required]
    public string Description { get; set; }

    [Required]
    public Guid  AvailablityId{ get; set; }

    public IList<Availability> AvailableUsers { get; set; }
}


public class Availability
{

    public Guid Id { get; set; }

    public string DateAvailable { get; set; }

    public IList<string> Name { get; set; }

}

 public AutoMapping()
    {
        CreateMap<Lanparty, LanpartyDto>()
            .ForMember(dest => dest.UsersAvailableForDate, m => m.MapFrom(src => src.AvailableUsers.ToDictionary(k=>k.DateAvailable, v=>v.Name.ToList())));



    }
公共类LanpartyDto
{
公共Guid Id{get;set;}
[必需]
公共字符串名称{get;set;}
[必需]
公共日期时间日期{get;set;}
[必需]
公共字符串说明{get;set;}
公共字典UsersAvailableForDate{get;set;}
}
公共类聚会
{
公共Guid Id{get;set;}
[必需]
公共字符串名称{get;set;}
[必需]
公共日期时间日期{get;set;}
[必需]
公共字符串说明{get;set;}
[必需]
公共Guid可用ID{get;set;}
公共IList可用用户{get;set;}
}
公共类可用性
{
公共Guid Id{get;set;}
公共字符串DateAvailable{get;set;}
公共IList名称{get;set;}
}
公共自动映射()
{
CreateMap()
.ForMember(dest=>dest.UsersAvailableForDate,m=>m.MapFrom(src=>src.AvailableUsers.ToDictionary(k=>k.DateAvailable,v=>v.Name.ToList());
}
那么我可以用多个嵌套类映射一个dto吗?到目前为止,我想不是因为我得到了一个地图例外,并在这里和谷歌上寻找,如果我也能提供一个可用性,这是可能的,但我认为没有任何用处?
那么,我最好的选择是改变前端代码,这样我就可以改变我的dto了?或者自己创建映射代码,因为这对于一个类来说并不困难?

您想要的映射如下所示:

CreateMap<Lanparty, LanpartyDto>()
    .ForMember(dest => dest.UsersAvailableForDate,
        m => m.MapFrom(src => src.AvailableUsers.ToDictionary(k => k.DateAvailable, v => v.Name)));

CreateMap<LanpartyDto, Lanparty>()
    .ForMember(dest => dest.AvailableUsers,
        m => m.MapFrom(src => src.UsersAvailableForDate.Select(u => new Availability { DateAvailable = u.Key, Name = u.Value })));
CreateMap()
.FormMember(dest=>dest.UsersAvailableForDate,
m=>m.MapFrom(src=>src.AvailableUsers.ToDictionary(k=>k.DateAvailable,v=>v.Name));
CreateMap()
.ForMember(dest=>dest.AvailableUsers,
m=>m.MapFrom(src=>src.UsersAvailableForDate.Select(u=>newavailability{dateavailability=u.Key,Name=u.Value}));

我允许自己将Availability.DateAvailable属性类型更改为DateTime,因为我不太明白您为什么在那里使用字符串。但是如果希望它是一个字符串,只需将
ToString()
添加到
u.Key
部分即可

您想要的映射如下所示:

CreateMap<Lanparty, LanpartyDto>()
    .ForMember(dest => dest.UsersAvailableForDate,
        m => m.MapFrom(src => src.AvailableUsers.ToDictionary(k => k.DateAvailable, v => v.Name)));

CreateMap<LanpartyDto, Lanparty>()
    .ForMember(dest => dest.AvailableUsers,
        m => m.MapFrom(src => src.UsersAvailableForDate.Select(u => new Availability { DateAvailable = u.Key, Name = u.Value })));
CreateMap()
.FormMember(dest=>dest.UsersAvailableForDate,
m=>m.MapFrom(src=>src.AvailableUsers.ToDictionary(k=>k.DateAvailable,v=>v.Name));
CreateMap()
.ForMember(dest=>dest.AvailableUsers,
m=>m.MapFrom(src=>src.UsersAvailableForDate.Select(u=>newavailability{dateavailability=u.Key,Name=u.Value}));


我允许自己将Availability.DateAvailable属性类型更改为DateTime,因为我不太明白您为什么在那里使用字符串。但是如果希望它是一个字符串,只需将
ToString()
添加到
u.Key
部分即可

你能分享你的AutoMapper配置文件的代码吗?还有,你为什么不遵守naimg公约?其中一个属性名以大写字母为星,另一个以小写字母为星。@gleb因为我直接在这里键入代码是为了创建一个简单的示例,所以我没有复制我的code@gleb我已经编辑了代码并自动映射,我已经使用了一个可用性来编辑,如果你想保留
字典用户savailablefordate
只需构建它直接在getter only属性中。因此,如果我理解正确,我必须进行另一个从availability到availability的映射,并将我的字典设置为get only?您可以共享AutoMapper配置文件的代码吗?还有,你为什么不遵守naimg公约?其中一个属性名以大写字母为星,另一个以小写字母为星。@gleb因为我直接在这里键入代码是为了创建一个简单的示例,所以我没有复制我的code@gleb我已经编辑了代码并自动映射,我已经使用了一个可用性来编辑,如果你想保留
字典用户savailablefordate
只需构建它直接在一个getter-only属性中。因此,如果我理解正确,我必须进行另一个从availability到availabilitydto的映射,并将我的字典设置为get-only?我想这可以实现这个示例中的thx技巧。今晚我将尝试我能做的事情this@TechnologyResearcher当然可以你可以在commets部分问我你可能会遇到的任何问题。这部分很有效。如果源是字典,目标是嵌套类,你能帮我解决其他问题吗?@TechnologyResearcher如果你能给出这些类的示例,我将不胜感激。以及您需要映射的属性。@TechnologyResearcher不客气。我很乐意帮忙,我想这可以达到thx的效果。对于这个例子,今晚我将尝试一下我能用它做些什么this@TechnologyResearcher当然可以你可以在commets部分问我你可能会遇到的任何问题。这部分很有效。如果源是字典,目标是嵌套类,你能帮我解决其他问题吗?@TechnologyResearcher如果你能给出这些类的示例,我将不胜感激。以及您需要映射的属性。@TechnologyResearcher不客气。我很乐意帮忙