Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется MYSQL: EF Core - PullRequest
0 голосов
/ 17 сентября 2018

Получение исключения DbUpdateException при попытке вставить данные в базу данных MySQL.Использовать пакет Pomelo.EntityFrameworkCore.MySql для создания моделей из базы данных, проект создается в ядре .net 2.1

StackTrace:

Сообщение об исключении: не удается добавить или обновитьдочерняя строка: сбой ограничения внешнего ключа (HMEBooking. Invoice, CONSTRAINT Invoice_ibfk_7 FOREIGN KEY (BookingId) ССЫЛКИ Booking (Id) ВКЛ УДАЛИТЬ НЕТ ДЕЙСТВИЯ ОБНОВЛЕНИЕ НЕТ ДЕЙСТВИЯ) Трассировка стека: вMySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet (ResultSet Resultset) в C: \ проекты \ mysqlconnector \ SRC \ mySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs: строка 93 в MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync (iOBehavior ioBehavior) в C: \ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs: строка 328 в MySql.Data.MySqlClient.MySqlDataReader.CreateAsync (команда MySqlCh): поведение Ivhaevior в IvB, команда типа MySqlChoe в разделе «Перекресток»:\ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs: строка 313 в MySqlConnector.Core.TextCommandExecutor.ExecuteReaderAsync (String commandText, MySqlParameterCollection, параметрCollection, поведение CommandBehavior, IOBehavior, ioBehavior, CancellationToken cancellationToken) в C: \ projects \ mysql.lq.lq.MySqlCommand.ExecuteDbDataReader (поведение CommandBehavior) в C: \ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlCommand.cs: строка 168 в Microsoft.EntityFrameworkCore.SmandTectionComMectionComMectionChancementInternectionChanceText.MoDementComEgnMectionComEQTeOIReadOnlyDictionary 2 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)
        {

        }
    }



}

Имеют отношение один ко многим между бронированием - bookingDetail, booking-invoice, bookingDetail - invoice

EF Core версия: 2.1 Поставщик базы данных: Pomelo.EntityFrameworkCore.MySql IDE: Visual Studio 2017

1 Ответ

0 голосов
/ 17 сентября 2018

Ошибка в том, что запись Invoice имеет недопустимое значение для Invoice.BookingId.

Глядя на свой тестовый код, вы создаете один объект Invoice, invoice;вы никогда не присваиваете свойство invoice.Booking и не добавляете invoice в коллекцию booking.Invoices, поэтому нет никакой связи между двумя установленными значениями, поэтому используется значение по умолчанию для Invoice.BookingId, а это значение PKне существует в таблице Booking.

Назначьте booking на invoice.Booking или добавьте invoice к booking.Invoices, и эта ошибка должна исчезнуть.

Это решение, однако, делаетНеправильный недостаток проекта - Invoice ссылается на Booking s и BookingDetail s, а BookingDetail s может затем ссылаться на другую запись Booking, приводящую к несогласованности данных.Для Invoice должна существовать одна функциональная зависимость, либо Invoice -> BookingDetail, либо Invoice -> Booking, но не обе.

...