Использование Automap для сопоставления ViewModel и Entity в отношениях «многие ко многим» - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть две сущности, и их отношения много ко многим.Код выглядит следующим образом:

public class Post : Entity
{
    //public int Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public DateTime CreateTime { get; set; }
    public DateTime LastModify { get; set; }

    public ICollection<PostTag> PostTags { get; set; }
    public int AuthorId { get; set; }
    public Author Author { get; set; }
}
public class Tag :Entity
{
    //public int Id { get; set; }
    public string TagName { get; set; }

    public ICollection<PostTag> PostTags { get; set; }
}
public class PostTag :Entity
{
    //public int Id { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }
    public int TagId { get; set; }
    public Tag Tag { get; set; }
}
public class PostViewModel
{
    public string Title { get; set; }
    public string Body { get; set; }
    public DateTime CreateTime { get; set; }
    public DateTime LastModify { get; set; }
    public int AuthorId { get; set; }
    public string AuthorName { get; set; }
    public List<TagViewModel> Tags { get; set; }
}

Теперь я создал конфигурацию отображения от сущности к модели представления:

CreateMap<Post, PostViewModel>()
    .ForMember(dest => dest.AuthorId, opt => opt.MapFrom(src => src.Author.Id))
    .ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.PostTags))
    .ForMember(dest => dest.AuthorName, opt => opt.MapFrom(src => src.Author.User.LastName))
    .ForMember(dest => dest.Body, opt => opt.MapFrom(src => src.Body))
    .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title))
    .ForMember(dest => dest.CreateTime, opt => opt.MapFrom(src => src.CreateTime))
    .ForMember(dest => dest.LastModify, opt => opt.MapFrom(src => src.LastModify))
    .ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.PostTags.Select(y => y.Tag).ToList()));

Мой вопрос такой, когда я получаю PostViewModel, например:

public async Task<IActionResult> Post([FromBody] PostViewModel postViewModel)
{

}

как мне сопоставить PostViewModel с Post?И я хочу создать Entity из PostViewModel и добавить их, которые представляют собой связь post, tag (если не существует) и postTag, в DbContext, что мне делать?

Я довольно новичок в autopper, и этоэто мой первый вопрос, я надеюсь, что я поступаю правильно, и я очень ценю ваш ответ и подсказку о том, как спросить.

1 Ответ

0 голосов
/ 02 января 2019

Я думаю, что у вас есть два варианта.

1) Обратное отображение

Вы можете просто добавить .ReverseMap() в конец вашей конфигурации отображения

CreateMap<Post, PostViewModel>()
    .ForMember(dest => dest.AuthorId, opt => opt.MapFrom(src => src.Author.Id))
    ...
    .ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.PostTags.Select(y => y.Tag).ToList()))
    .ReverseMap();

2) Вы можете определить новую конфигурацию для PostViewModel до Post

CreateMap<PostViewModel, Post>()
    .ForMember(dest => dest.Author.Id, opt => opt.MapFrom(src => src.AuthorId))
    ...etc

Тогда Mapper.Map<Post>(postViewModel)

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