Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется 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, IReadOnlyDictionary2 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, не оба.

Другие вопросы по тегам