在ASP.Net Core 2.1项目中自动映射

时间:2018-09-27 18:27:39

标签: asp.net-core automapper

我的UserIdentity表中有一个自定义字段,称为“名称”。名称字段将包含已注册用户的名称。

public class User : IdentityUser
    {       
        public string Name { get; set; }
        public bool CanNotify { get; set; }

    }

我还有一个名为Post的表,其中有一个字段“ AuthorName”

public class Post
    { 
        public Instant Published { get; set; }
        public string Content { get; set; }
        public Guid UserId { get; set; }
        public string AuthorName { get; set; } 
}

创建/发布博客时,我希望AuthorName应该是已登录的作者,这意味着AuthorName应该与当前已登录的UserManager表中的Name关联。

public async Task<IActionResult> OnPostAsync()
{
    cmd = _mapper.Map(User, cmd);
}

public class Mapper : Profile
{
   public Mapper()
   {
       CreateMap<ClaimsPrincipal, CreatePostCommand>(MemberList.None)
                   .ForMember(d => d.UserId, m => m.MapFrom(s => 
                   Guid.Parse(s.FindFirstValue(ClaimTypes.NameIdentifier))))
                .ForMember(d => d.Name, m => m.MapFrom(s => s.Identity.AuthorName));

   }
}

以上代码可以正常工作,但是我不希望映射身份名称,而应该从UserManager表进行映射,我已经尝试了很多逻辑,但是没有用,让我粘贴其中之一:-

CreateMap<ClaimsPrincipal, CreatePostCommand>(MemberList.Source)
              .ForMember(d => d.UserId, m => m.MapFrom(s => Guid.Parse(s.FindFirstValue(ClaimTypes.NameIdentifier))))
              .ForMember(d => d.Name, m => m.MapFrom(s => s.FindFirst(_userManager.GetUserAsync(User).Result.AuthorName)));

但是上述映射规则给我一个错误

  

“用户”是一种类型,在给定的上下文中无效

1 个答案:

答案 0 :(得分:0)

您可能会从蓝色的“用户”中看到,“用户”被编译器解释为类型(或可能是方法),但编译器错误表明它被解释为类型,即也很合逻辑,因为存在类型User)。这可能只是因为您有一个User类。

问题是:您试图将哪个对象/变量传递给_userManager.GetUserAsync()?将该变量从User重命名为其他名称(例如LocalUser或myUser或其他名称),这应该可以解决问题。