Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется MYSQL: EF Core
Получение DbUpdateException при попытке вставить данные в базу данных MySQL. Использовать пакет Pomelo.EntityFrameworkCore.MySql для выгрузки моделей из базы данных, проект создается в.net core 2.1
Трассировки стека:
Сообщение об исключении: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (
HMEBooking
,Invoice
, ОГРАНИЧЕНИЕInvoice_ibfk_7
ИНОСТРАННЫЙ КЛЮЧ (BookingId
) РЕКОМЕНДАЦИИBooking
(Id
) В УДАЛЕНИИ НЕТ ДЕЙСТВИЙ В ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ) Трассировка стека: в MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet) в C:\projects\mysqlconnector\src\MySqlConnector\MySqlqlSata: MySQL:. 93 по адресу MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync(IOBehavior ioBehavior) в C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClate_SysDirect_SYS Команда MySqlCommand, поведение CommandBehavior, поведение IOBehavior (ioBehavior) в C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient \ MySqlDataReader.cs: строка 313 в MySqlConnector.ExeO, IOBehavior ioBehavior, CancellationToken cancellationToken) в C:\projects\mysqlconnector\src\MySqlConnector\Core\TextCommandExecutor.cs: строка 73 в MySql.Data.MySqlClient.MySqlCommand.ExecuteDbataReader(поведение CommandBehavior) в C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs: строка 168 в файле Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.lationDemoDectionModemDemandMeditionMoDeOdMeOConnect_omd_MeditionMeO2 parameterValues) at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary
2 parameterValues) в Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(соединение IRelationalConnection)
Есть модели Booking, BookingDetail и Invoice. BookingDetail имеет отношение к Booking, Invoice имеет отношение к Booking и BookingDetail.
При добавлении записей в базу данных возникает ошибка. Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено. Но когда у меня есть те же модели в не ядре приложения.net, это работает
Пожалуйста, дайте мне знать, если я где-то ошибаюсь. Спасибо вам за помощь.
Ниже приведены модели, которые используются
public partial class Booking
{
public Booking()
{
BookingDetail = new HashSet<BookingDetail>();
Invoice = new HashSet<Invoice>();
}
[Column(TypeName = "bigint(20)")]
public long Id { get; set; }
[Required]
[Column(TypeName = "varchar(50)")]
public string TempId { get; set; }
[InverseProperty("Booking")]
public ICollection<BookingDetail> BookingDetail { get; set; }
[InverseProperty("Booking")]
public ICollection<Invoice> Invoice { get; set; }
}
public partial class BookingDetail
{
public BookingDetail()
{
Invoice = new HashSet<Invoice>();
}
[Column(TypeName = "bigint(20)")]
public long Id { get; set; }
[Required]
[Column(TypeName = "varchar(50)")]
public string CreatedBy { get; set; }
[Column(TypeName = "datetime")]
public DateTime CreatedOn { get; set; }
[Required]
[Column(TypeName = "varchar(50)")]
public string ModifiedBy { get; set; }
[Column(TypeName = "datetime")]
public DateTime ModifiedOn { get; set; }
[Column(TypeName = "bigint(20)")]
public long BookingId { get; set; }
[ForeignKey("BookingId")]
[InverseProperty("BookingDetail")]
public Booking Booking { get; set; }
[InverseProperty("BookingDetail")]
public ICollection<Invoice> Invoice { get; set; }
}
public partial class Invoice
{
[Column(TypeName = "bigint(20)")]
public long Id { get; set; }
[Column(TypeName = "bigint(20)")]
public long BookingId { get; set; }
[Column(TypeName = "bigint(20)")]
public long BookingDetailId { get; set; }
[Column(TypeName = "datetime")]
public DateTime CreatedOn { get; set; }
[Column(TypeName = "datetime")]
public DateTime CreatedBy { get; set; }
[Column(TypeName = "datetime")]
public DateTime ModifiedOn { get; set; }
[Required]
[Column(TypeName = "varchar(50)")]
public string ModifiedBy { get; set; }
[ForeignKey("BookingId")]
[InverseProperty("Invoice")]
public Booking Booking { get; set; }
[ForeignKey("BookingDetailId")]
[InverseProperty("Invoice")]
public BookingDetail BookingDetail { get; set; }
}
public class Class1
{
HMEBookingContext context = new HMEBookingContext();
#region declarations
public long BookingId { get; set; }
public string CustomerEmailId { get; set; } = "admin@holidayme.com";
#endregion
Random rnd = new Random();
public void insert()
{
try
{
Booking booking = new Booking();
booking.TempBookingId = BookingRefNumber.ToString();
var bookingDetail = new List<BookingDetail>();
BookingDetail detail = new BookingDetail();
detail.CreatedBy = CustomerEmailId;
detail.CreatedOn = DateTime.Now;
detail.ModifiedBy = "1";
detail.ModifiedOn = DateTime.UtcNow;
detail.BookingStatusId = 1;
var invoices = new List<Invoice>();
Invoice invoice = new Invoice();
invoices.Add(invoice);
detail.Invoice = invoices;
bookingDetail.Add(detail);
booking.BookingDetail = bookingDetail;
context.Add(booking);
context.SaveChanges(true);
BookingId=booking.Id
}
catch(DbUpdateException upd)
{
}
catch(Exception ex)
{
}
}
}
Имеют отношение один ко многим между бронированием - заказ детали, бронирование накладной, бронирование детали - накладная
Версия EF Core: 2.1 Поставщик базы данных: Pomelo.EntityFrameworkCore.MySql IDE: Visual Studio 2017
1 ответ
Ошибка в том, что Invoice
запись имеет недопустимое значение для Invoice.BookingId
,
Глядя на свой тестовый код, вы создаете единый Invoice
объект, invoice
; Вы никогда не назначаете invoice.Booking
собственность, и вы не добавляете invoice
к booking.Invoices
сбор, поэтому нет никакой связи между двумя установленными, таким образом, значение по умолчанию для Invoice.BookingId
используется, и что значение PK не существует в таблице Booking
,
приписывать booking
в invoice.Booking
или добавить invoice
в booking.Invoices
и эта ошибка должна уйти.
Это решение, однако, не исправляет недостаток конструкции - Invoice
ссылки как Booking
с и BookingDetail
с и BookingDetail
Затем можно ссылаться на другой Booking
запись ведет к несогласованности данных. Единственная функциональная зависимость должна существовать для Invoice
, или Invoice -> BookingDetail
или же Invoice -> Booking
, не оба.