Blazor / Entity Framework - Обновление родительского элемента при добавлении дочерней коллекции в - PullRequest
3 голосов
/ 08 апреля 2020

Я использую Blazor приложение на стороне сервера с Entity Framework.

У меня есть родительская сущность Booking с дочерней коллекцией Tours. У меня есть страница, на которой я добавляю туры в коллекцию Tours бронирования .

public class Booking
{
   IEnumerable<Tours> Tours { get; set; }
}

У меня есть основной родительский компонент бронирования, который является лишь оболочкой для подкомпонентов бронирования, люблю туры. Я передаю дочернюю коллекцию дочернему компоненту, как показано на странице бронирования:

<Tours Tours="Booking.Tours" />

@code {
    protected override async Task OnInitializedAsync()
    {
        Booking = await BookingService.GetBooking(reference);
    }
}

Однако я обнаружил, что при добавлении Tour страница не обновляется с новыми добавлен тур, если я не позвоню, чтобы забрать бронирование с его дочерними элементами.

private async Task addTour(TourState state)
{
    var newBookingTour = new BookingTour();

     var newTour = await BookingTourService.CreateBookingTour(newBookingTour);        

     // UI ONLY UPDATES WHEN I DO THIS

     Booking = await BookingService.GetBooking();
}

Вот обобщение c method, которое я использую для сохранения сущностей в DB:

public async Task<TEntity> Upsert(TEntity item)
{
    var entity = this.Context.Update(item);
    await this.SaveChangesAsync();
    return entity.Entity;
}

Должен ли я снова звонить на DB? Конечно, Entity Framework должен взять вновь добавленную сущность и передать ее в UI? Я чувствую, что чего-то здесь не хватает!

Любая помощь приветствуется, поскольку я новичок в EF и Blazor.

1 Ответ

3 голосов
/ 08 апреля 2020

Должен ли я действительно звонить в БД снова?

Нет, вы не должны.

Конечно, Entity Framework должен взять вновь добавленную сущность

Да, это так

и передать ее через пользовательский интерфейс?

Нет, не нужно, вам нужно

Вам просто нужно обновить модель, вам не нужно извлекать ее из базы данных, поскольку у вас уже есть ссылка на новый элемент.

При условии, что ваша служба возвращает объект:

private async Task addTour(TourState state)
{
   var newBookingTour = new BookingTour();

   var newTour = await BookingTourService.CreateBookingTour(newBookingTour);        


   Booking = ExistingBookig.Tours.Add(newTour);
}
...