由于外键问题,无法插入新记录

时间:2018-06-19 11:25:35

标签: c# sql linq tsql

我已经看到很多关于此特定错误消息的帖子,但似乎都没有涵盖我的问题。错误是:“ INSERT语句与FOREIGN KEY约束冲突”

我在名为Tests的表中将外键设置为Null,因为并非每个记录在另一个称为APIS的表中都有对应的记录。

在SSMS中,我可以插入一条新记录而没有任何问题,这是我的INSERT查询。

INSERT INTO [dbo].[Tests]
       ([APIID]
       ,[ActiveID]
       ,[ABCDataID]
       ,[ReferenceNumber]
       ,[LocationAddress]
       ,[LocationPostCode]
       ,[Make]
       ,[Model]
       ,[Registration]
       ,[WPC]
       ,[IsA]
       ,[IsS]
       ,[SelfSetDate]
       ,[IsBA]
       ,[UserID]
       ,[ClaimAtFaultEnum]
       ,[ClaimADriverEnum]
       ,[XRepair]
       ,[ManRepair]
       ,[HybridRepair]
       ,[BodyType]
       ,[CustomerName]
       ,[CustomerEmail]
       ,[CustomerMobileNumber]
       ,[IsCancelled]
       ,[CancellationNote])
 VALUES
       (NULL, 
        NULL, 
       NUll,
       '111111111',
       'Waterside',
      'KA18 8EX',
       'Abarth', 
       '320',
       'TIL1607',
       NULL, 
       1,
       0, 
       NULL, 
       0,
       NUll, 
       1, 
       1, 
       0, 
       0, 
       0, 
       'Car',
       'John Smith', 
       'John@TIL1607TestData.com', 
       '07test', 
       0, 
       Null)
GO

以下是我尝试使用c#放入数据库的相同数据,它仅在设置外键时才起作用。我不能将NULL用作它的int字段,并且不会接受它,如果我将其完全省略,它将出现上述错误消息。

    Test testToAllocate = new Test();

        if (testToAllocate != null)
        {
            int intClaimDriver = -1;
            int intClaimAtFault = -1;
            if (rdoDriverDriver.Checked)
            {
                intClaimDriver = (int)Enums.Test.Driver;
            }
            if (rdoNonDriver.Checked)
            {
                intClaimDriver = (int)Enums.Test.NonDriver;
            }
            if (rdoFaultFault.Checked)
            {
                intClaimAtFault = (int)Enums.Test.Fault;
            }
            if (rdoFaultNonFault.Checked)
            {
                intClaimAtFault = (int)Enums.Test.NonFault;
            }
            if (rdoFaultThirdParty.Checked)
            {
                intClaimAtFault = (int)Enums.Test.ThirdParty;
            }

            ABCData testToABC = db.AudaBridgeClaimDatas.Where(a => a.Registration == txtVehicleRegistration.Text).FirstOrDefault();
            if (testToAllocate != null)
            {
                testToAllocate.ABCDataID = testToABC.ABCDataID;
            }
            else
            {
                testToAllocate.ABCDataID = null;
            }


         //   testToAllocate.APIID = 5; //Needs to be Null
            testToAllocate.ReferenceNumber = "111111111"; 
            testToAllocate.LocationAddress = "Waterside";
            testToAllocate.LocationPostCode = "KA18 8EX";
            testToAllocate.Make = "Abarth";
            testToAllocate.Model = "320";
            testToAllocate.Registration = "TIL1607";
            testToAllocate.IsA = true;
            testToAllocate.IsS = false;
            testToAllocate.IsBA = false;
            testToAllocate.ClaimADriverEnum = 1;
            testToAllocate.ClaimAtFaultEnum = 1;
            testToAllocate.XRepair = false;
            testToAllocate.ManRepair = false;
            testToAllocate.HybridRepair = false;
            testToAllocate.BodyType = "Car";
            testToAllocate.CustomerName = "John Smith";
            testToAllocate.CustomerEmail = "John@TIL1607TestData.com";
            testToAllocate.CustomerMobileNumber = "07test";
            testToAllocate.IsCancelled = false; 

            db.Claims.InsertOnSubmit(testToAllocate);
            db.SubmitChanges();

有人有什么想法吗?似乎Visual Studio尚未意识到我对数据库所做的更改,以使此字段为空。

2 个答案:

答案 0 :(得分:2)

  

我不能放NULL,因为它是一个int字段,不会接受它

然后您的模型不反映您的数据库。如果您的数据库具有可为空的字段,则需要可为空的int:int?

  

如果我完全忽略了它,则会出现上述错误消息

因为模型的那个字段的数据类型错误,并且int的默认值为0。如果目标表中没有对应的记录0,则表示违反了外键约束。

  

Visual Studio几乎没有意识到我对数据库所做的更改,以使此字段为空。

的确。如果您使用某种工具从数据库生成类,请重新运行该工具。如果不是,请相应地更新模型。您有一个可为空的数据库字段和一个不可为空的模型字段。

基本上,您的模型上的位置是这样的:

public int SomeField { get; set; }

您想要的是这样的

publit int? SomeField { get; set; }

然后,您可以将SomeField设置为null

答案 1 :(得分:0)

  

我在名为“测试为空”的表中设置了一个外键

     

我不能放NULL,因为它是一个int字段,不会接受它

将类型int代替int?,它是一个可为null的int。这将允许您将值设置为null。

请参见MSDN