适应另一个模型后缺少映射模型

时间:2018-05-01 12:07:12

标签: c# asp.net-core json-api mapster

我有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
}

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

使用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"
    }]
}

1 个答案:

答案 0 :(得分:0)

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

但是,当您尝试将相同的AuthorRequest映射到(单个)Book时,由于它们太不相同而无效:AuthorRequest具有属性{{ 1}},NameSurname,而Books的属性为BookTitle。那里根本没有匹配。

您可以做的是映射 Author对象中的书籍,执行此操作:

AuthorRequest

这不会将模型中的var bookEntities = model.Books.Adapt<Book[]>(); 个对象的集合映射到BookRequest数组。这应该按预期工作。

请注意,Mapster已足够智能,可以自行映射嵌套类型。如果查看Book对象,您将看到嵌套的图书实体已正确映射。因此,如果您想将authorEntity(包含AuthorRequest s)映射到包含BookRequest个实体的Author实体,那么您的第一行应该已经足够了:

Book

Result of the previous code in LINQPad