15

我在表会话和用户之间有一个外键约束。具体来说,Sessions.UID = Users.ID。有时,我希望 Sessions.UID 为空。这可以允许吗?每当我尝试这样做时,都会收到 FK 约束违规。

具体来说,我通过 LINQ 在 Sessions 中插入一行。我设置了 Session.User = null; 我得到这个错误:

试图删除用户和会话之间的关系。但是,不能将关系的外键之一 (Session.UID) 设置为 null。

但是,当我删除使 User 属性为空的行时,我在 SubmitChanges 行上收到此错误:

值不能为空。
参数名称:cons

我的表中没有一个名为“cons”的字段,在我的 5,500 行 DataContext.designer.cs 文件中也没有,也没有在任何相关对象的 QuickWatch 中,所以我不知道“cons”是什么.

在数据库中,Session.UID 是一个可为空的 int 字段,而 User.ID 是一个不可为空的 int。我想记录可能有也可能没有 UID 的会话,我宁愿在不禁用对 FK 关系的约束的情况下这样做。有没有办法做到这一点?

4

1 回答 1

27

我似乎记得之前创建了一个可以为空的 FK,所以我做了一个快速测试。正如您在下面看到的,它绝对是可行的(在 MSSQL 2005 上测试)。

编写表格和约束的相关部分并发布它们,以便我们进一步排除故障。

CREATE DATABASE [NullableFKTest]
GO
USE [NullableFKTest]
GO
CREATE TABLE OneTable 
(
    OneId  [int] NOT NULL,
    CONSTRAINT [PK_OneTable] PRIMARY KEY CLUSTERED 
    (
        [OneId] ASC
    )
)
CREATE TABLE ManyTable (ManyId  [int] IDENTITY(1,1) NOT NULL, OneId [int] NULL)
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ManyTable_OneTable]') AND parent_object_id = OBJECT_ID(N'[dbo].[ManyTable]') )
ALTER TABLE [dbo].[ManyTable]  WITH CHECK ADD CONSTRAINT [FK_ManyTable_OneTable] FOREIGN KEY([OneId])
    REFERENCES [dbo].[OneTable] ([OneId])   
GO

--let's get a value in here
insert into OneTable(OneId) values(1)
select* from OneTable

--let's try creating a valid relationship to the FK table OneTable
insert into ManyTable(OneId) values (1) --fine
--now, let's try NULL
insert into ManyTable(OneId) values (NULL) --also fine
--how about a non-existent OneTable entry?
insert into ManyTable(OneId) values (5) --BOOM! - FK violation

select* from ManyTable
--1, 1
--2, NULL

--cleanup
ALTER TABLE ManyTable DROP CONSTRAINT FK_ManyTable_OneTable
GO
drop TABLE OneTable
GO
drop TABLE ManyTable
GO
USE [Master]
GO
DROP DATABASE NullableFKTest
于 2009-02-19T16:57:56.897 回答