0

我有 2 个服务模型和 2 个 DAL 模型。在创建新作者时,我想将其书籍保存到 Book 表中。因此,我将有效负载作为 json 发送。但是,如果我尝试使模型适应 Book 模型,它的值为 null。所以我可以解决这个问题。我也试过model.Adapt<IEnumerable<Book>>()了,这也为空。

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

服务模型

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模型

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;
}

使用 mapster 进行映射

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"
    }]
}
4

1 回答 1

1

为什么你期望model.Adapt<Book>()在这里产生任何结果?映射实体通常通过复制相似的属性来工作。这适用于AuthorRequest并且Author因为它们都包含相同的属性。因此,当您映射 时modelAuthorRequest您可以正确地得到一个填充的Author对象。

但是,当您尝试将其映射AuthorRequest到(单个)Book时,这将不起作用,因为它们太不同了:AuthorRequest具有属性NameSurnameBooks,而Book具有属性TitleAuthor。那里根本没有比赛。

您可以做的是映射对象的书籍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 中之前代码的结果

于 2018-05-01T12:26:13.997 回答