C# 插入数据时,为什么插入与FK约束冲突?
我正在将数据插入数据库的Receipts表中。此表与链接到C# 插入数据时,为什么插入与FK约束冲突?,c#,sql-server,C#,Sql Server,我正在将数据插入数据库的Receipts表中。此表与链接到Stores.Id=Receipts.StoreId 插入有时会遇到以下错误: System.Data.SqlClient.SqlException:INSERT语句与外键约束“FK_dbo.Receipts_dbo.Stores_StoreId”冲突 我在数据库中发布了5000篇文章,而这个错误在那批文章中只发生了10次。所有5 000个员额的数据都相同(见下文代码) 编辑 我已经运行了第二批5000篇文章,这一次所有的文章都没有错误,
Stores.Id=Receipts.StoreId
插入有时会遇到以下错误:
System.Data.SqlClient.SqlException:INSERT语句与外键约束“FK_dbo.Receipts_dbo.Stores_StoreId”冲突
我在数据库中发布了5000篇文章,而这个错误在那批文章中只发生了10次。所有5 000个员额的数据都相同(见下文代码)
编辑
我已经运行了第二批5000篇文章,这一次所有的文章都没有错误,有效地使错误发生的几率达到1000:1
我已经验证了Stores表中有一个存储,其Id值在ajax post数据中指定
有谁能告诉我为什么我发送的帖子中只有1/500的帖子出现了这个错误
// function gets the receipt number from the loop that calls it
function CreateData(receiptNumber) {
var StoreId = 5;
var ReceiptValue = 100.50;
var Cashback = 10.50;
var Receipt = {
"StoreId": StoreId,
"ReceiptNumber": receiptNumber,
"ReceiptValue": ReceiptValue,
"Cashback": Cashback };
return Receipt;
}
// function initiates the loop for x times
function LoopPostData ( iterations ) {
for ( var i = 1; i <= iterations; i++ ) {
PostData( i );
}
}
function PostData ( iteration ) {
var PostCompleted = false,
ReceiptNumber = "TST-"+ pad( iteration, 4 );
UpdatePostsTable( "- Attempting to post "+ ReceiptNumber );
$.ajax( {
type: "post",
url: "http://localhost:54354/api/Receipt",
data: CreateData( ReceiptNumber ),
success: function () {
var msg = "-"+ ReceiptNumber +" was saved on the API";
UpdateSuccessTable( msg ); // indicate the post was saved
},
statusCode: {
400: function () {
var msg = "-"+ ReceiptNumber +" was sent to API but not saved";
UpdateErrorsTable( msg ); // indicate the post couldn't be saved
PostCompleted = true;
}
},
error: function () {
if ( PostCompleted ) return;
var msg = "-"+ ReceiptNumber +" was not sent to the API";
UpdateErrorsTable( msg ); // indicate the post was sent to the API
}
} );
}
上面的ajax文章对此进行了分析
这是Stores表(记住ajax是用Id 5(Roman's Pizza)发布到商店的)
基于此,我不能相信会发生错误,因为在Stores表中没有新收据的链接记录
编辑2
我粘贴了实体框架代码最初用于创建表的POCO类,以及用于创建表的SQL代码
为了节省一些时间,根据错误消息,这里是有问题的外键约束:
ALTER TABLE [dbo].[Receipts] WITH CHECK ADD CONSTRAINT [FK_dbo.Receipts_dbo.Stores_StoreId] FOREIGN KEY([StoreId])
REFERENCES [dbo].[Stores] ([Id])
ON DELETE CASCADE
GO
编辑3
我只更新了服务器代码,使EF将其查询记录到VisualStudio中的输出窗口
这是它执行的一个INSERT命令(该命令是随机选择的)
我想您正在尝试将
Store
表中不存在的storeId
插入到Receipts
表中…向我们展示FK定义和两个表定义,包括PKs和任何约束。以及任何一个表上的任何触发器。@Kaf everyReceipts
fromCreateData(ReceiptNumber)
具有相同的StoreID=5
。Ortund:您可能应该调试您的API。可能字段的分配顺序正确。@rbaryyoung数据库图表是否有帮助?您已经指出您存在数据库问题,但只向我们提供了前端代码。我想您正在尝试插入StoreID
,即在Store
表中不存在,在Receipts
表中…向我们显示FK定义和两个表定义,包括PKs和任何约束。以及任何一个表上的任何触发器。@Kaf everyReceipts
fromCreateData(ReceiptNumber)
具有相同的StoreID=5
。Ortund:您可能应该调试您的API。可能字段的分配顺序正确。@rbaryYoung数据库图表是否有帮助?您已经指出您有数据库问题,但只向我们提供了前端代码。
ALTER TABLE [dbo].[Receipts] WITH CHECK ADD CONSTRAINT [FK_dbo.Receipts_dbo.Stores_StoreId] FOREIGN KEY([StoreId])
REFERENCES [dbo].[Stores] ([Id])
ON DELETE CASCADE
GO
INSERT [dbo].[Receipts]([StoreId], [UserId], [ReceiptNumber],
[ReceiptValue], [ReceiptDate], [Cashback], [ValidUntil],
[Calculated], [Redeemed], [Deleted], [Invoice_Id])
VALUES (@0, NULL, @1, @2, @3, @4, @5, @6, @7, @8, NULL)
SELECT [Id]
FROM [dbo].[Receipts]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
-- @0: '1' (Type = Int32)
-- @1: 'TST-0006' (Type = String, Size = -1)
-- @2: '100.5' (Type = Decimal, Precision = 18, Scale = 2)
-- @3: '2016/07/28 6:38:38 PM' (Type = DateTime2)
-- @4: '10.5' (Type = Decimal, Precision = 18, Scale = 2)
Opened connection at 2016/07/28 6:38:38 PM +02:00
-- @5: '2016/08/04 6:38:38 PM' (Type = DateTime2)
Started transaction at 2016/07/28 6:38:38 PM +02:00
-- @6: 'False' (Type = Boolean)
-- @7: 'False' (Type = Boolean)
-- @8: 'False' (Type = Boolean)