【问题标题】:ASP.NET the insert statement conflicted with the foreign key constraintASP.NET 的插入语句与外键约束冲突
【发布时间】:2015-05-17 12:08:12
【问题描述】:

我需要一些指导,了解为什么每次尝试添加产品时我的网站都会出现此错误。为了让您知道,我确实对数据库进行了一些更改,但在我这样做之后,我完全重新创建了数据库。我不断收到以下错误:

INSERT 语句与 FOREIGN KEY 约束“FK_dbo.OrderDetails_dbo.Orders_OrderId”冲突。冲突发生在数据库“MythData.mdf”、表“dbo.Orders”、列“Id”中。

这两个表是OrderDetailOrders

订单:

CREATE TABLE [dbo].[Orders] 
(
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [CustomerId]  INT            NOT NULL,
    [ProductId]   INT            NOT NULL,
    [ShipName]    NVARCHAR (MAX) NULL,
    [ShipAddress] NVARCHAR (MAX) NULL,
    [ShipCity]    NVARCHAR (MAX) NULL,
    [ShipState]   NVARCHAR (MAX) NULL,
    [ShipZip]     NVARCHAR (MAX) NULL,

    CONSTRAINT [PK_dbo.Orders] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_dbo.Orders_dbo.Customers_CustomerId] 
      FOREIGN KEY ([CustomerId]) 
      REFERENCES [dbo].[Customers] ([Id]) ON DELETE CASCADE
);

CREATE NONCLUSTERED INDEX [IX_CustomerId] 
   ON [dbo].[Orders]([CustomerId] ASC); 

OrderDetail表:

CREATE TABLE [dbo].[OrderDetails] 
(
    [Id]          INT             IDENTITY (1, 1) NOT NULL,
    [OrderId]     INT             NOT NULL,
    [ProductId]   INT             NOT NULL,
    [TotalCost]   DECIMAL (18, 2) NOT NULL,
    [SubTypeMail] BIT             NOT NULL,
    [Quantity]    INT             NOT NULL,

    CONSTRAINT [PK_dbo.OrderDetails] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_dbo.OrderDetails_dbo.Orders_OrderId] 
       FOREIGN KEY ([OrderId]) 
       REFERENCES [dbo].[Orders] ([Id]) ON DELETE CASCADE
);

CREATE NONCLUSTERED INDEX [IX_OrderId]
    ON [dbo].[OrderDetails]([OrderId] ASC);

还有弹出错误的类:

using (DataContext entities = new DataContext())
{
     var orderDetail = entities.OrderDetails.Create();
     decimal price = 0;

     if (drpSub.SelectedValue == "Mailed")
     {
         price = 10;
         orderDetail.SubTypeMail = true;
     }
     else
     {
         price = 5;
         orderDetail.SubTypeMail = false;
     }

     Count = orderDetail.Quantity;
     orderDetail.TotalCost = Count * price;

     entities.OrderDetails.Add(orderDetail);
     entities.SaveChanges(); << this line is the issue!
}

还包括确切的跟踪内容:

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:INSERT 语句与 FOREIGN KEY 约束“FK_dbo.OrderDetails_dbo.Orders_OrderId”冲突。冲突发生在数据库“MythData.mdf”、表“dbo.Orders”、列“Id”中。

来源错误:

第 121 行:orderDetail.TotalCost = 计数 * 价格;
第 122 行:entities.OrderDetails.Add(orderDetail);
第 123 行:entities.SaveChanges();
第 124 行:while (Count != 0)
第 125 行:{

源文件:c:\Users\arielle davenport\Desktop\pets\pets\MythPetsDatabase\MythPetsDatabase\Pages\Products.aspx.cs 行:123

我知道这很长,但感谢任何帮助。现在真的卡住了!

【问题讨论】:

  • 如果你想插入一个条目到OrderDetail - 你必须首先有一个Order 连接到!!
  • 所以我要添加一个 Session["OrderId"]?不确定语法
  • @rellez89,您的问题解决了吗?

标签: c# sql asp.net sql-server tsql


【解决方案1】:

错误消息准确地告诉您问题出在哪里:您正在尝试将具有外键约束的行插入到另一个表中,而该列中的值在另一个表中不存在。

让我们分解一下:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.OrderDetails_dbo.Orders_OrderId". 
The conflict occurred in database "MythData.mdf", table "dbo.Orders", column 'Id'.

它为您提供了约束的名称,因此您可以根据需要查看其定义。但是这个名称几乎可以告诉您您需要知道的内容...... OrderDetails 表中的 OrderId 必须与 Orders 表中的 Id 匹配。但是 Orders 表当前没有与您尝试插入 OrderDetails 表的 ID 匹配的 ID。它甚至告诉您问题出在 Orders 表中,其中“id”列与您尝试插入 OrderDetails 的行没有匹配值。

有两种可能的原因:

1) 您的代码中有一个错误,它试图在 OrderDetails 表的 id 列中插入错误的值,或者根本无法在 Order 表中插入一行

或更可能:

2) 您尝试以错误的顺序插入行...您需要在尝试插入该订单的 OrderDetails 之前将订单插入 Orders 表中。

您必须确保在插入 OrderDetails 之前已插入 Order,以便满足外键约束的条件。这正是 FK 约束的用途:防止您插入不一致的数据,其中某些值(还)无效。

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多