Отображение списка значений внешнего ключа Asp Net Web Api - PullRequest
0 голосов
/ 01 июня 2019

JsonError

Работая над моим приложением для управления тренажерным залом, я столкнулся с отображением сбора данных, связанных с моделью клиента.

Проблема связана со следующими моделями:

public class Client
{
    [Key]
    public int Id { get; set; }

    public int CardId { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }

    public string PersonalInfo => "ID: " + CardId + ": " + Name + " " + Surname;

    public int? GymEntries { get; set; }
    public int? MartialArtsEntries { get; set; }

    public int? GymEntriesLeft { get; set; }
    public int? MartialArtsEntriesLeft { get; set; }

    public DateTime? ClientJoined { get; set; }
    public DateTime? SubscriptionExpires { get; set; }

    public int? SubscriptionId { get; set; }
    public virtual Subscription Subscription { get; set; }

    public bool? IsDeleted { get; set; }

    public virtual ICollection<Payment> Payments { get; set; }
}


public class Payment
{
    [Key]
    public int Id { get; set; }

    public int ClientId { get; set; }
    public virtual Client Client { get; set; }

    public int? SubscriptionId { get; set; }
    public virtual Subscription Subscription { get; set; }

    public int CashRegistered { get; set; }
    public string AdditionalInformation { get; set; }

    public DateTime? PaymentRegistered { get; set; }
    public DateTime? SubscriptionExpires { get; set; }

}

Все работает нормально, пока я не хочу, чтобы мой клиентский контроллер при получении запроса get / id возвращал все данные клиента, включая все связанные платежиИдентификатор клиента из Платежа.Результат Json в Postman не возвращает правильный формат, он пропускает список платежей.

Именно так я пытаюсь сделать это в моем контроллере

[HttpGet("{id}")]
public async Task<ActionResult<Client>> GetClient(int id)
{
   var client = await _context.Client.FindAsync(id);
   var subscription = await _context.Subscription.FindAsync(client.SubscriptionId); 
   var payments = await _context.Payment.Where(p => p.Client == client).ToListAsync();

   client.Subscription = subscription;
   client.Payments = payments;

   if (client == null)
   {
       return NotFound();
   }

   if (client.IsDeleted == true)
   {
       return NotFound();
   }

   return client;
}

1 Ответ

0 голосов
/ 01 июня 2019

Попробуйте:

var payments = await _context.Payment.Where(p => p.ClientId == client.Id).ToListAsync();

Вы должны использовать Id для выбора сущностей, но не целых сущностей.

UPD:

Попробуйте установить атрибут [JsonIgnore] на public virtual Client Client { get; set; } в вашем Payment классе.Чтобы запретить сериализацию json из бесконечного цикла.

Также вы можете остановить цикл самоссылки из-за прокси при преобразовании сущности в JSON следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...