无法添加或更新子行:外键约束失败MYSQL:EF Core

问题描述 投票:0回答:1

尝试在MySQL数据库中插入数据时获取DbUpdateException。已经使用Pomelo.EntityFrameworkCore.MySql包来从数据库中构建模型,该项目是在.net core 2.1中创建的

堆栈跟踪:

异常消息:无法添加或更新子行:外键约束失败(HMEBooking.Invoice,CONSTRAINT Invoice_ibfk_7 FOREIGN KEY(BookingId)REFERENCES BookingId)ON DELETE NO ACTION ON UPDATE NO ACTION)堆栈跟踪:at MySql.Data。 C:\ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs中的MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet):C中MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync(IOBehavior ioBehavior)的第93行: \ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs:C:\ projects \ mysqlconnector \ src中MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(MySqlCommand命令,CommandBehavior行为,IOBehavior ioBehavior)的第328行\ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs:MySqlConnector.Core.TextCommandExecutor.ExecuteReaderAsync中的第313行(String commandText,MySqlParameterCollection parameterCollection,CommandBehavior behavior,IOBehavior ioB在C:\ projects \ mysqlconnector \ src \ MySqlConnector \ Core \ TextCommandExecutor.cs中的行为,CancellationToken cancellationToken):在C:\ projects \ mysqlconnector \ src \ MySqlConnector中的MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior行为)中的第73行\ MySql.Data.MySqlClient \ MySqlCommand.cs:Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection连接,DbCommandMethod executeMethod,IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary2 parameterValues)的第168行,位于Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection连接)

有预订,预订详细信息和发票模型。 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; } = "[email protected]";      
    #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,预订发票,预订详细信息 - 发票之间有一对多关系

EF Core版本:2.1数据库提供程序:Pomelo.EntityFrameworkCore.MySql IDE:Visual Studio 2017

mysql .net-core visual-studio-2017 ef-core-2.1 pomelo
1个回答
0
投票

错误是Invoice记录对Invoice.BookingId的值无效。

查看测试代码,创建一个Invoice对象,invoice;你从来没有指定invoice.Booking属性,也没有将invoice添加到booking.Invoices集合中,因此没有建立两者的关系,因此正在使用Invoice.BookingId的默认值,并且表Booking中不存在PK值。

booking分配给invoice.Booking或将invoice添加到booking.Invoices,此错误应该消失。

然而,这个解决方案没有纠正设计缺陷 - Invoice引用了Bookings和BookingDetails,然后BookingDetails可以引用不同的Booking记录导致数据不一致。 InvoiceInvoice -> BookingDetailInvoice -> Booking都应该存在单一功能依赖,而不是两者都存在。

© www.soinside.com 2019 - 2024. All rights reserved.