15

テーブル セッションとユーザーの間に外部キー制約があります。具体的には、Sessions.UID = Users.ID です。ときどき、Sessions.UID を null にしたいことがあります。これは許されますか?これを行おうとするたびに、FK Constraint Violation が発生します。

具体的には、LINQ を介してセッションに行を挿入しています。Session.User = null; を設定しました。そして、私はこのエラーを受け取ります:

ユーザーとセッションの間の関係を削除しようとしました。ただし、リレーションシップの外部キー (Session.UID) の 1 つを null に設定することはできません。

ただし、User プロパティを null にする行を削除すると、SubmitChanges 行で次のエラーが発生します。

値を null にすることはできません。
パラメータ名: cons

どのテーブルにも「cons」というフィールドがなく、5,500 行の DataContext.designer.cs ファイルにも、関連オブジェクトの QuickWatch にも含まれていないため、「cons」が何であるかわかりません。 .

データベースでは、Session.UID は null 許容の int フィールドであり、User.ID は null 非許容の int です。UID がある場合とない場合があるセッションを記録したいのですが、その FK 関係の制約を無効にせずに記録したいと考えています。これを行う方法はありますか?

4

1 に答える 1

27

以前に null 可能な 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 に答える