Отсутствует модель сопоставления после адаптации к другой модели

У меня есть 2 сервисные модели и 2 модели DAL. При создании нового автора я хочу сохранить его книги в таблице книг. Итак, я отправляю полезную нагрузку как JSON. Однако, если я попытаюсь адаптировать модель к модели Книги, ее значения будут нулевыми. Поэтому я могу решить эту проблему. Я тоже пробовал model.Adapt<IEnumerable<Book>>()это также приходит ноль.

public async Task<AuthorRequest> CreateAsync(AuthorRequest model)
{
    var authorEntity= model.Adapt<Author>(); // works fine
    var bookEntity =model.Adapt<Book>();//null
}

Service.Models

public class AuthorRequest :Identifiable<string>
{
    public string override Id{get;set;}

    [Attr("name")]
    public string Name { get; set; }

    [Attr("surname")]
    public string Surname { get; set; }

    public  ICollection<BookRequest> Books{get; set; }
}

public class BookRequest :Identifiable<string>
{
    public string override Id{get;set;}
    public string Title { get; set; }
}

DAL.Model

public class Author : AuditableEntity
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("surname")]
    public string Surname { get; set; }

    [JsonProperty("books")]
    public Relationship<IList<Book>> Books;
}

public class Book :AuditableEntity
{
    [JsonProperty("Title")]
    public string Title { get; set; }

    [JsonProperty("Author")]
    public Relationship<IList<Author>> Author;
}

Сопоставления с картстером

TypeAdapterConfig<DAL.Models.Author, Service.Models.AuthorRequest>.NewConfig();
TypeAdapterConfig<DAL.Models.Book, Service.Models.AuthorRequest>.NewConfig();
TypeAdapterConfig<DAL.Models.Book, Service.Models.BookRequest>.NewConfig();

TypeAdapterConfig<Service.Models.AuthorRequest, DAL.Models.Author>.NewConfig();
TypeAdapterConfig<Service.Models.AuthorRequest, DAL.Models.Book>.NewConfig();
TypeAdapterConfig<Service.Models.BookRequest, DAL.Models.Book>.NewConfig();

AuthorRequest.JSON

{
    "name": "William",
    "surname": "Shakespeare",
    "books": [{
        "title": "Macheth"
    }]
}

1 ответ

Почему вы ожидаете model.Adapt<Book>() дать какой-либо результат здесь? Сопоставление сущностей обычно работает путем копирования похожих свойств. Это работает для AuthorRequest а также Author потому что они оба содержат одинаковые свойства. Поэтому, когда вы отображаете model, который является AuthorRequest, вы правильно наполнили Author Возврат

Тем не менее, когда вы пытаетесь сопоставить то же самое AuthorRequest к (одному) Book тогда это не сработает, так как они слишком разные: AuthorRequest имеет свойства Name, Surname, а также Books, в то время как Book имеет свойства Title а также Author, Там просто нет совпадения там.

Что вы можете сделать, это нанести на карту книги, которые находятся в пределах AuthorRequest объект, делающий это:

var bookEntities = model.Books.Adapt<Book[]>();

Это не будет отображать коллекцию BookRequest объекты, которые находятся в модели до Book массив. Это должно работать как ожидалось.

Обратите внимание, что Mapster уже достаточно умен, чтобы отображать вложенные типы самостоятельно. Если вы посмотрите на authorEntity объект, вы увидите, что вложенные объекты книги также были правильно отображены. Так что если вы хотите отобразить AuthorRequest (который содержит BookRequests) к Author сущность, содержащая Book сущностей, тогда вашей первой строки уже должно быть достаточно:

var r = new AuthorRequest
{
    Name = "William",
    Surname = "Shakespeare",
    Books = new BookRequest[] {
        new BookRequest { Title = "Macbeth" },
        new BookRequest { Title = "Romeo and Juliet" },
    },
};
r.Adapt<Author>().Dump();

Результат предыдущего кода в LINQPad

Другие вопросы по тегам