Не удалось обновить дочернюю таблицу при обновлении родительской таблицы в EF

#c# #asp.net-core #asp.net-web-api #entity-framework-core #ef-code-first

Вопрос:

У меня есть 4 стола. родитель — Запрос, таблицы детей — Запрос клиента, запросы рейсов, запросы отелей.

Я могу успешно создать новый запрос (вся таблица обновляется новыми данными запроса).

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

 {
    "id": 3,
    "enquiryType": 3,
    
    "customers": {
         "id": 7,
        "customerName": " updated updated",
        "enquiryId": 3
    },
    "flights": {
        "id": 7,
        "enquiryId": 3,
        "departureAirportId": 9,
        "arrivalAirportId": 2
    },
    "hotels": {
        "id": 7,
        "hotelLocation": "location updated updated",
        "enquiryId": 3
    }
}
 
  • Это мои данные для обновления. (Я использую те же данные без идентификатора, запрос идентификатора для записи, которая работает(строка создана))
  • Когда вы ДОБАВЛЯЕТЕ этот запрос json, "enquiryType": 3, он обновляется. НО дети не упадали духом.

В результате получается

 {
    "message": "Site Enquiry updated",
    "enquiry": {
        "id": 3,
        "enquiryType": 3,

        "customers": null,
        "flights": null,
        "hotels": null
    }
}
 
  • После этого обновления, если я снова отправлю тот же запрос json (без идентификаторов ребенка) Все таблицы обновляются)

Я понятия не имею, почему возникает эта проблема? кто-нибудь, помогите мне найти проблему.

Это коды, которые я использовал

Модель Equiry.ts

  public class Enquiry
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        public EnquiryType EnquiryType { get; set; }

        public EnquiryCustomer Customers { get; set; }

        public EnquiryFlight Flights { get; set; }

        public EnquiryHotel Hotels { get; set; }

    }

    public class EnquiryCustomer
    {
        public int Id { get; set; }

        [Required]
        public string CustomerName { get; set; }

        public Enquiry Enquiry { get; set; }

        [Required]
        public int EnquiryId { get; set; }
    }

    public class EnquiryHotel
    {
        public int Id { get; set; }

        [Required]
        public string HotelLocation { get; set; }

        public Enquiry Enquiry { get; set; }

        [Required]
        public int EnquiryId { get; set; }
    }

    public class EnquiryFlight
    {
        public int Id { get; set; }

        public int DepartureAirportId { get; set; }

        public Departure DepartureAirport { get; set; }

        public Enquiry Enquiry { get; set; }

        [Required]
        public int EnquiryId { get; set; }

    }

 

EnquiryViewModel

  public class EnquiryViewModel
    {

        [Required]
        public EnquiryType EnquiryType { get; set; }

        public EnquiryCustomer Customers { get; set; }

        public EnquiryFlight Flights { get; set; }

        public EnquiryHotel Hotels { get; set; }

    }

    public class EnquiryCustomer
    {
        public int Id { get; set; }

        [Required]
        public string CustomerName { get; set; }

        public EnquiryViewModel Enquiry { get; set; }

        [Required]
        public int EnquiryId { get; set; }
    }

    public class EnquiryHotel
    {
        public int Id { get; set; }
        public string HotelLocation { get; set; }

        public EnquiryViewModel Enquiry { get; set; }

        [Required]
        public int EnquiryId { get; set; }
    }

    public class EnquiryFlight
    {
        public int Id { get; set; }

        [Required]
        public int DepartureAirportId { get; set; }
        
        [Required]
        public int ArrivalAirportId { get; set; }

        public EnquiryViewModel Enquiry { get; set; }

        [Required]
        public int EnquiryId { get; set; }
    }
 

EnquiryController.cs

         public async Task<IActionResult> Update(int id, [FromBody] EnquiryViewModel enquiry)
        {
            try
            {
                var result = await _enquiryService.Get(id);

                if (result == null)
                {
                    return NotFound(new { message = "Site Enquiry not found" });
                }


                _mapper.Map<EnquiryViewModel, Enquiry>(enquiry, result);  // mapping works fine

                await _enquiryService.Update(result);

                return Ok(new { message = "Site Enquiry updated", enquiry = result });
            }
            catch (Exception ex)
            {
                return HandleException(ex);
            }
        }
 

Service.cs

   public async Task<int> Update(Enquiry enquiry)
        {
            _catalogDbContext.Enquirys.Update(enquiry); // untill this line all works fine

            return await _catalogDbContext.SaveChangesAsync(); // after the Database updates Childern's data change as `null`
        }
 

DbContext.cs

      public DbSet<Enquiry> Enquirys { get; set; }

        public DbSet<EnquiryCustomer> EnquiryCustomer { get; set; }

        public DbSet<EnquiryHotel> EnquiryHotel { get; set; }
        
        public DbSet<EnquiryFlight> EnquiryFlight { get; set; }
 

Данные ребенка изменяются на ноль в этой строке return await _catalogDbContext.SaveChangesAsync();

Кто-нибудь может найти проблему?

Комментарии:

1. Зачем ты _catalogDbContext.Enquirys.Update(enquiry) вообще звонишь? EF автоматически отслеживает изменения в объектах.

2. Я не звоню по этой линии. да, я удаляю эту строку сейчас. Но моя проблема еще не решена. У вас есть какие-либо идеи, почему дочерний ответ равен нулю при обновлении

3. Если вы хотите обновить Children , вы должны использовать Include(x => Children) Get метод in.