Отображение нескольких таблиц в один DTO in.Entity Framework Core - некоторые свойства не отображаются в выводе JSON - PullRequest
0 голосов
/ 07 января 2019

У меня есть base класс, как следует

 [DataContract]
 public class BaseTable
 {        
     [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
     public DateTime? Created { get; set; }

     [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
     public DateTime? Updated { get; set; }
 }

Вот мой parent класс

 [DataContract]
 public class Parent:BaseTable
 {
    [Required]
    [DataMember(Name = "key")]
    [Key]
    public Guid Key { get; set; }

    [Required]
    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "Child")]
    public virtual ICollection<Child> Children{ get; set; }
 }

Вот Child класс

[DataContract]
public class Child:BaseTable
{
    [Required]
    [DataMember(Name = "key")]
    [Key]
    public Guid Key { get; set; }

    [ForeignKey("ParentKey")]
    [IgnoreDataMember]
    public virtual Parent Parent{ get; set; }

    public Guid GrandChildKey { get; set; }

    [ForeignKey("GrandChildKey")]
    public virtual GrandChild GrandChild { get; set; }

 }

Вот GrandChild Класс

[DataContract]
public class GrandChild:BaseTable
{
    [Required]
    [DataMember(Name = "key")]
    [Key]
    public Guid Key { get; set; }

    [Required]
    [DataMember(Name = "name")]
    public string Name { get; set; }
 }

Вот мой метод API контроллера

    [HttpGet]
    [Route("parentgroups")]
    [Produces("application/json")]
    [SwaggerOperation("GetSupportedParentGroups")]
    [SwaggerResponse(400, "Bad input parameter")]
    [SwaggerResponse(404, "Not found")]
    [SwaggerResponse(500, "Internal server error")]
    [ProducesResponseType(200, Type = typeof(Parent))]
    public async Task<IActionResult> GetParentGroups()
    {
             var result = await _context.Parents
             .Include(b => b.Children)
              .ThenInclude(children=> children.GrandChild)
                   .ToListAsync();

             return Ok(result);
    }

Я вижу все правильные значения внутри result во время отладки.

Но возвращенный JSON имеет null значения для дочерних объектов. !!

Что-то, чего мне не хватает?

Как я могу сопоставить эти несколько объектов одному DTO?

Я создал отображение, как это

         CreateMap<ParentDto, Parent>()
            .ForMember(d => d.Key, opt => opt.MapFrom(s => s.Key))
            .ForMember(d => d.Name, opt => opt.MapFrom(s => s.Name))
            .ForMember(d => d.Children, opt => opt.MapFrom(s => Mapper.Map<ParentDto, Child>(s)))

Все еще не работает

1 Ответ

0 голосов
/ 07 января 2019

Подходящим методом для этой ситуации является преобразование данных повторного результата в строку методом JsonConvert:

  string stItems = JsonConvert.SerializeObject(result, Formatting.Indented,
        new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        });
        return ok(stItems);
...