#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.