【问题标题】:Missing Mapping Model after Adapting to another model适配其他模型后缺少映射模型
【发布时间】:2018-10-11 11:23:22
【问题描述】:

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

【问题讨论】:

  • 我不了解 Mapster,但您为什么希望 model.Adapt&lt;Book&gt;() 在这里工作?如果model.Adapt&lt;Author&gt;() 映射到作者,那么这很有效,因为模型看起来像一个Author 对象。但它只包含(可能多本)书,它不是一本书,所以它不会映射也就不足为奇了。也许你需要在这里做model.Books.Adapt&lt;Book[]&gt;()之类的事情?

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


【解决方案1】:

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

但是,当您尝试将相同的 AuthorRequest 映射到(单个)Book 时,这将不起作用,因为它们太不同了:AuthorRequest 具有属性 NameSurname、和Books,而Book 具有属性TitleAuthor。那里根本没有匹配。

您可以做的是映射 AuthorRequest 对象内的书籍,这样做:

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

这不会将模型内的BookRequest 对象集合映射到Book 数组。这应该可以按预期工作。

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

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();

【讨论】:

  • 使用 model.Adapt 的原因是我不想使用 foreach 循环,也不想创建 Book 实体的新实例。 model.Books.Adapt&lt;Book[]&gt;(); 也不适合我。
  • @beetlejuice 您是否检查过model 确实包含您的值?您是否查看了 authorEntity 对象以查看它是否已包含书籍实体?试试我的例子,看看它是否适合你。还要检查您的 Relationship 类型是否在那里引起任何问题(我没有这样做,因为我不知道它是什么);您可能必须配置 Mapster 才能识别它。
  • 是的,我检查了我的authorEntity,它包含书籍的值。当适应方法失败时,我已经按照您在示例中显示的那样完成了。我同意你的看法。与mapster配置有关。
猜你喜欢
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多