Проблема сопоставления сущностей - PullRequest
0 голосов
/ 25 июня 2018

Когда сообщение запускается, оно не сохраняет имя пользователя и фамилию.У меня есть пользовательский класс, который наследует от класса identityuser, и я объявил два свойства имя и фамилия, как в фрагменте кода.Но проблема в том, что, когда я добавляю сообщение в репозиторий, оно не сохраняет имя пользователя, а показывает нулевое значение, которое выдает исключение.

Я не понимаю, как сопоставить, чтобы имя пользователя было сохранено вбаза данных.

 public abstract class AuditableEntity
 {
            [Required]
            public string Title { get; set; }
            [Required]
            public string Description { get; set; }
            public DateTime PostCreatedDate { get; set; }
            [Required]
            public User User { get; set; }  
        }

   public class TechPost : AuditableEntity
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }


    }   

    public class User : IdentityUser
    {
        [Required]
        public string FirstName { get; set; }
        [Required]
        public string LastName { get; set; }


    }
    public class TechPostCreation
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Title { get; set; }
        public DateTime PostCreatedDate { get; set; }
        public string Description { get; set; }
    }

    [HttpPost()]
    public IActionResult CreatePost([FromBody] TechPostCreation techCreatePost)
    {
        if (techCreatePost == null)
        {
            return BadRequest();
        }
        var techPostEntity = _mapper.Map<TechPost>(techCreatePost);
        _repo.AddTechBlogPost(techPostEntity);

        if (!_repo.Save())
        {
            return StatusCode(500, "A problem happend and could handle your request");
        }

        var techPostReturn = _mapper.Map<TechPostViewModel>(techPostEntity);

        return CreatedAtRoute("GetTechPost", new { id = techPostReturn.Id },
                techPostReturn);

    }

    public RepoMapping()
    {
        CreateMap<TechPost, TechPostViewModel>()
                 .ForMember(dest => dest.Name, opt => opt.MapFrom(src =>
                   $"{src.User.FirstName} {src.User.LastName}"));

        CreateMap<TravelPost, TravelPostViewModel>()
               .ForMember(dest => dest.Name, opt => opt.MapFrom(src =>
                   $"{src.User.FirstName} {src.User.LastName}"));

        CreateMap<TechPostCreation, TechPost>();

    }

1 Ответ

0 голосов
/ 26 июня 2018

Эта строка:

var techPostEntity = _mapper.Map<TechPost>(techCreatePost);

Использует эту карту:

CreateMap<TechPostCreation, TechPost>();

Поскольку ваш класс User является дочерним для TechPost, вам необходимо предложение MapFrom.Вместо этого вы можете переименовать поля в UserFirstName / UserLastName, чтобы соглашение вступило в силу.

Измените вашу карту:

CreateMap<TechPostCreation, TechPost>()
    .ForMember(dest => dest.User.FirstName, opt => opt.MapFrom(src => src.FirstName))
    .ForMember(dest => dest.User.LastName, opt => opt.MapFrom(src => src.LastName));

Кроме того, я не уверен, что делает ваше репо,но вам может понадобиться получить или создать User с UserManager в какой-то момент вашего процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...