Отсутствует модель сопоставления после адаптации к другой модели
У меня есть 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
(который содержит 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();