我已经看到很多关于此特定错误消息的帖子,但似乎都没有涵盖我的问题。错误是:“ 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尚未意识到我对数据库所做的更改,以使此字段为空。
答案 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)