SQL Server 2005: недопустимое ограничение внешнего ключа

У меня есть ограничение внешнего ключа между таблицами Sessions и Users. В частности, Session.UID = Users.ID. Иногда я хочу, чтобы Session.UID был нулевым. Можно ли это разрешить? Каждый раз, когда я пытаюсь это сделать, я получаю нарушение ограничений FK.

В частности, я вставляю строку в сеансы через LINQ. Я установил Session.User = null; и я получаю эту ошибку:

 Была предпринята попытка удалить отношения между пользователем и сеансом. Однако одно из внешних связей отношения (Session.UID) не может быть установлено в значение null.

Однако, когда я удаляю строку, которая возвращает значение свойства User, я получаю эту ошибку в моей строке SubmitChanges:

 Значение не может быть нулевым.
Имя параметра: cons

Ни одна из моих таблиц не имеет поля под названием "cons", равно как и в моем файле DataContext.designer.cs с 5,5 тыс. строк, а также в QuickWatch для любого из связанных объектов, поэтому я понятия не имею, минусы ".

В базе данных Session.UID является полем с нулевым значением int, а User.ID - недействительным int. Я хочу записывать сеансы, которые могут иметь или не иметь UID, и я бы предпочел сделать это, не отключая ограничений на эти отношения FK. Есть ли способ сделать это?

Ответы

Ответ 1

Мне казалось, что я помню, как создавал NULL-FK раньше, поэтому я быстро провел тест. Как вы можете видеть ниже, это определенно выполнимо (проверено на MSSQL 2005).

Script соответствующие части ваших таблиц и ограничений и разместите их, чтобы мы могли устранить неполадки.

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 get a value in here
insert into OneTable(OneId) values(1)
select* from OneTable

--let try creating a valid relationship to the FK table OneTable
insert into ManyTable(OneId) values (1) --fine
--now, let 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