【问题标题】:Error inserting data into SQL Server database with foreign key in ASP.NET (could not find primary key)在 ASP.NET 中使用外键将数据插入 SQL Server 数据库时出错(找不到主键)
【发布时间】:2023-03-22 23:40:01
【问题描述】:

我在 Visual Studio 2008 中使用 ASP.NET MVC2。我相信 SQL Server 是 2005。

我有两个表:EquipmentInventory 和 EquipmentRequested

  • EquipmentInventory 有一个主键 sCode
  • EquipmentRequested 有一个 外键称为 sCode 基于 EquipmentInventory 中的 sCode。

我正在尝试以下代码(删除了许多不相关的代码):

        try
        {
            EChODatabaseConnection myDB = new EChODatabaseConnection();

//this section of code works fine.  The data shows up in the database as expected
            foreach (var equip in oldData.RequestList)
            {
                if (equip.iCount > 0)
                {
                    dbEquipmentInventory dumbEquip = new dbEquipmentInventory();
                    dumbEquip.sCode = equip.sCodePrefix + newRequest.iRequestID + oldData.sRequestor;
                    myDB.AddTodbEquipmentInventorySet(dumbEquip);
                }
            }

            myDB.SaveChanges();   //save this out immediately so we can add in new requests

//this code runs fine
            foreach (var equip in oldData.RequestList)
            {
                if (equip.iCount > 0)
                {
                    dbEquipmentRequested reqEquip = new dbEquipmentRequested();
                    reqEquip.sCode = equip.sCodePrefix + newRequest.iRequestID + oldData.sRequestor;
                    myDB.AddTodbEquipmentRequestedSet(reqEquip);
                }
            }

//but when I try to save the above result, I get an error
            myDB.SaveChanges();

oldData 被传递到函数中。 newRequest 是添加到“非相关”表的结果。 newRequest.iRequestID 确实有一个值。

查看 reqEquip 是监视窗口,我注意到 EquipInventory 为空。

我收到的错误信息是: “'EChODatabaseConnection.dbEquipmentRequestedSet' 中的实体参与了 'FK_EquipmentRequested_EquipmentInventory_sCode' 关系。找到了 0 个相关的 'EquipmentInventory'。需要 1 个 'EquipmentInventory'。”

显然我做错了什么,但到目前为止,我似乎无法找到问题所在。

有人对如何将记录正确插入具有外键引用的表有一些提示吗?

更新:
我正在使用数据实体框架。

更新:
感谢 Rob 的回答,我能够找出我的错误。 正如 Rob 所说,我需要为外键设置引用。

我的编码结果如下:

            foreach (var equip in oldData.RequestList)
            {
                if (equip.iCount > 0)
                {
                    dbEquipmentInventory dumbEquip = new dbEquipmentInventory();
                    dumbEquip.sCode = equip.sCodePrefix + newRequest.iRequestID + oldData.sRequestor;
                    myDB.AddTodbEquipmentInventorySet(dumbEquip);

                    //add in our actual request items
                    dbEquipmentRequested reqEquip = new dbEquipmentRequested();
                    reqEquip.EquipmentInventory = dumbEquip;
                    myDB.AddTodbEquipmentRequestedSet(reqEquip);
                }
            }

            myDB.SaveChanges();   

有没有人看到更好的方法来做到这一点?

【问题讨论】:

    标签: asp.net sql-server


    【解决方案1】:

    您使用什么作为 ORM?我相信无论您使用哪一个,您都可以使用大多数 ORM 的外键处理来为您处理这个问题。例如,您制作了一个新的dumbEquip,不要立即保存。做你的 dbEquipmentRequested reqEquip = new dbEquipmentRequested();并将数据添加到其中,然后说dumbEquip.dbEquipmentRequested.Add(reqEquip)。然后保存记录,ORM 应该按照 FK 所需的正确顺序保存记录,甚至将 FK ID 输入到 reqEquip 记录中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多