Отсутствует модель сопоставления после адаптации к другой модели - PullRequest
0 голосов
/ 01 мая 2018

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

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 Ответ

0 голосов
/ 01 мая 2018

Почему вы ожидаете, что 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 (который содержит BookRequest s) на 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();

Result of the previous code in LINQPad

...