EF Core — вложенное свойство не отображается в JsonC#

Место общения программистов C#
Ответить
Anonymous
 EF Core — вложенное свойство не отображается в Json

Сообщение Anonymous »

Я работаю над API Odata с .NET. Я столкнулся с проблемой с реализацией одной из моих конечных точек. У меня есть вложенный массив, который не возвращается в ответе JSON. Служба /software имеет два метода: getAll() и getById(int id). У меня есть объекты под названием Software, SoftwareVersion, Computer и ComputerSoftwareVersion, которые преобразуют отношения «многие ко многим» между компьютерами и версиями программного обеспечения. Я пытаюсь показать для каждого программного обеспечения список версий и серверы, на которых они установлены. Ниже приведены определения моих классов, реализованные мной сопоставления и реализация сервиса. К сожалению, я не вижу массив установок в json-ответах браузера (как будто этого поля не существует в модели данных).
ОПРЕДЕЛЕНИЕ КЛАССА< /strong>

Код: Выделить всё

namespace Data.Entities
{
public class Computer
{
// COMPUTER BLOCK
public int id { get; set; }
public string name { get; set; }
public string serial { get; set; }
public string otherserial { get; set; }

public string uuid { get; set; }
public string comment { get; set; }
public Boolean? is_deleted { get; set; }
public IEnumerable SoftwareVersions { get; set; }

public virtual IEnumerable ComputerSoftwareVersions { get; set; }
}

Код: Выделить всё

namespace Data.Custom
{
public class CustomComputer
{
public int id { get; set; }
public string name { get; set; }
public string serial { get; set; }
public string uuid { get; set; }
public string comment { get; set; }

}
}

Код: Выделить всё

namespace Data.Entities
{
public class Software
{
public int id { get; set; }
public Boolean? is_deleted { get; set; }
public string name { get; set; }
public string comment { get; set; }

public DateTime? date_creation { get; set; }

//public int softwares_id { get; set; }

public int softwarecategories_id { get; set; }
public virtual SoftwareCategorie SoftwareCategorie { get; set; }

public int manufacturers_id { get; set; }
public virtual Manufacturer Manufacturer { get; set; }

public int entities_id { get; set; }
public virtual Entitie Entitie { get; set; }

public int groups_id { get; set; }
public virtual Group Group { get; set; }

public ICollection SoftwareVersions { get; set; }

}
}

Код: Выделить всё


namespace Data.Entities
{
public class SoftwareVersion
{
public int id { get; set; }
public string name { get; set; }

public int softwares_id { get; set; }
public virtual Software Software { get; set; }

public virtual ICollection  Computers { get; set; }

public virtual ICollection ComputerSoftwareVersions { get; set; }
}
}

Код: Выделить всё

namespace Data.Custom
{
public class CustomSoftware
{
public int id { get; set; }
public string name { get; set; }
public string entity { get; set; }
public string publisher { get; set; }
public string group { get; set; }

public  string software_category { get; set; }
public virtual IEnumerable versions { get; set; }
}
}

Код: Выделить всё

namespace Data.Custom
{
public class CustomSoftwareVersion
{
public string name { get; set; }

public  IEnumerable installations { get; set; }

}
}

Код: Выделить всё

using System;

namespace Data.Custom
{
public class CustomComputerSoftwareVersion
{
public int id { get; set; }
public string name { get; set; }
public string status { get; set; }
public string hosting_area { get; set; }

}
}

*** КОМПЬЮТЕРНОЕ КАРТИРОВАНИЕ***

Код: Выделить всё

public class ComputerMapping : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{

builder.HasMany(c => c.SoftwareVersions)
.WithMany(t => t.Computers)
.UsingEntity(x => x.HasOne(x => x.SoftwareVersion).WithMany().HasForeignKey(x => x.softwareversions_id).IsRequired(true),
x => x.HasOne(x => x.Computer).WithMany().HasForeignKey(x => x.items_id).IsRequired(true),
x =>  x.ToTable("glpi_items_softwareversions"));

builder.ToTable("computers");

}
}
}
СОСТАВЛЕНИЕ ВЕРСИЙ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ[/b]

Код: Выделить всё

{
public class SoftwareVersionMapping : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.HasKey(c => c.id);

builder.HasOne(c => c.Software).WithMany(l => l.SoftwareVersions).HasForeignKey(c => c.softwares_id).IsRequired(false);

builder.HasMany(c => c.Computers)
.WithMany(t => t.SoftwareVersions)
.UsingEntity(x => x.HasOne(x => x.Computer).WithMany(l=>l.ComputerSoftwareVersions).HasForeignKey(x => x.items_id).IsRequired(true),
x => x.HasOne(x => x.SoftwareVersion).WithMany(l => l.ComputerSoftwareVersions).HasForeignKey(x => x.softwareversions_id).IsRequired(true),
x => x.ToTable("glpi_items_softwareversions"));

builder.ToTable("softwareversions");
}
}
}
ОТОБРАЖЕНИЕ КОМПЬЮТЕРНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Код: Выделить всё

{
public class ComputerSoftwareVersionMapping : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.HasKey(c => c.id);

builder.HasOne(c => c.SoftwareVersion).WithMany(l => l.ComputerSoftwareVersions).HasForeignKey(c => c.softwareversions_id).IsRequired(true);
builder.HasOne(c => c.Computer).WithMany(l => l.ComputerSoftwareVersions).HasForeignKey(c => c.items_id).IsRequired(false);

builder.ToTable("items_softwareversions");
}
}
}
ВНЕДРЕНИЕ УСЛУГ

Код: Выделить всё

public IQueryable GetById(int id)
{
return _db
.Where(s => s.id == id)
.Where(s => s.is_deleted == false)
.Include(s => s.SoftwareVersions)
.ThenInclude(d => d.Computers)
.ThenInclude(x => x.ComputerWsusInfo)
.ThenInclude(c => c.ComputerDetailDatacenter)
.Select(s => new CustomSoftware
{
id = s.id,
name = s.name,
entity = s.Entitie.name,
publisher = s.Manufacturer.name,
group = s.Group.name,
software_category = s.SoftwareCategorie.completename,
versions = s.SoftwareVersions.Select(d => new CustomSoftwareVersion
{
name = d.name,
installations = d.Computers.Select(x => new CustomComputerSoftwareVersion
{
name = x.name,
status = x.State.name,
hosting_area = x.ComputerWsusInfo.ComputerDetailDatacenter.name
})
})
});
}
Я могу видеть в браузере все свойства, кроме свойства установки. Я устал менять тип, возвращаемый на «объект», поэтому удалил все пользовательские объекты. Это сработало, но для метода getAll время ожидания запроса истекло. На самом деле я хочу сохранить формат Iqueryable, поскольку он соответствует остальным моим конечным точкам. Я также зарегистрировал запрос, сгенерированный LINQ, и увидел соединения между всеми таблицами. По какой-то причине я не вижу массив установок.
Спасибо, что уделили время!
С уважением!

Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-in-json
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»