При включении других объектов загружаются и другие списки, что приводит к рекурсии, как я могу предотвратить это? - PullRequest
0 голосов
/ 05 мая 2019

У меня есть большая база данных в фоновом режиме:

public partial class Phone
    {
        public string Imei { get; set; }
        public int ColourId { get; set; }
        public int StorageId { get; set; }
        public int TypeId { get; set; }
        public int ModelId { get; set; }
        public int PurchasePrice { get; set; }
        public DateTime? SaleDate { get; set; }
        public DateTime? RentalStart { get; set; }
        public DateTime? RentalFinish { get; set; }

        public virtual Colour Colour { get; set; }
        public virtual Storage Storage { get; set; }
        public virtual Type Type { get; set; }
    }
public partial class Storage
    {
        public Storage()
        {
            Phone = new HashSet<Phone>();
        }

        public int StorageId { get; set; }
        public string Amount { get; set; }

        public virtual ICollection<Phone> Phone { get; set; }
    }

И я запрашиваю такие телефонные данные в моем WebAPI:

[HttpGet]
// GET: Phones
public async Task<IActionResult> Index()
{
   var phoneCalculatorContext = _context.Phone.Include(p => 
   p.Colour).Include(p => p.Storage).Include(p => p.Type);
   return Ok(await phoneCalculatorContext.Take(10).ToListAsync());
}

Я разместил ответ JSON здесь:

https://textuploader.com/1dtu2

Как вы можете видеть в моем ответе, хранилище включено (как и ожидалось), но хранилище имеет ссылку на мою коллекцию телефонов, и это продолжается и продолжается (как рекурсия)

Можно ли не получать списки? Поскольку мне не нужны списки, мне просто нужно получить количество из хранилища , но не списка pone.

Извините за плохое понимание EF, но я новичок в этом.

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Для отключения сериализации самостоятельной ссылки, вы можете попробовать SerializerSettings.ReferenceLoopHandling как

services.AddMvc()
        .AddJsonOptions(opt => {
            opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
0 голосов
/ 05 мая 2019

Если вам не нужно, чтобы хранилище знало, сколько это телефонов, вы можете удалить свойство ICollection. Другим решением является пометка свойства телефонов в хранилище как

[JsonIgnore]
public virtual ICollection<Phone> Phone { get; set; }
...