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

时间:2018-09-17 09:52:57

标签: mysql .net-core visual-studio-2017 ef-core-2.1 pomelo

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

StackTrace:

  

异常消息:无法添加或更新子行:外键约束失败(HMEBookingInvoice,CONSTRAINT Invoice_ibfk_7外键(BookingId)参考{{ 1}}(Booking上的“删除无操作”,“更新无操作”)   堆栈跟踪:位于C:\ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs:line 93处的MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet)      在C:\ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs:line 328处的MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync(IOBehavior ioBehavior)      在MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(MySqlCommand命令,CommandBehavior行为,IOBehavior ioBehavior)在C:\ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs:line 313      在C:\ projects \ mysqlconnector \ src \ MySqlConnector \ Core \ TextCommandExecutor.cs:line 73中的MySqlConnector.Core.TextCommandExecutor.ExecuteReaderAsync(String commandText,MySqlParameterCollection parameterCollection,CommandBehavior behavior,IOBehavior ioBehavior,CancellationToken cancellingToken)中      在C:\ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlCommand.cs:line 168处的MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior行为)      在Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection连接,DbCommandMethod executeMethod,IReadOnlyDictionary Id 2参数值)处      在Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection连接)处

具有预订,BookingDetail和发票模型。 BookingDetail与Booking有关系, 发票与Booking和BookingDetail有关系。

将条目添加到数据库时出现错误无法添加或更新子行:外键约束失败。 但是,当我在非.net核心应用程序中使用相同的模型时,它将起作用

请让我知道我是否在某处出错。 谢谢您的帮助。

下面是使用的模型

2 parameterValues)
     at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary

预订-预订详细信息,预订-发票,预订详细信息-发票之间具有一对多的关系

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

1 个答案:

答案 0 :(得分:0)

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

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

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

但是,此解决方案无法纠正设计缺陷-Invoice可以同时引用BookingBookingDetail,而BookingDetail可以引用不同的{{ 1}}记录导致数据不一致。对于BookingInvoiceInvoice -> BookingDetail应该存在单个功能依赖关系,而不是两者都存在。