2009-01-31 13 views
15

मेरे पास टेबल और उपयोगकर्ता टेबल के बीच एक विदेशी कुंजी बाधा है। विशेष रूप से, सत्र.यूआईडी = उपयोगकर्ता.आईडी। कभी-कभी, मुझे सत्र चाहिए। यूआईडी शून्य होना चाहिए। क्या इसकी अनुमति दी जा सकती है? जब भी मैं ऐसा करने की कोशिश करता हूं, मुझे एक एफके प्रतिबंध उल्लंघन मिलता है।एसक्यूएल सर्वर 2005: निरर्थक विदेशी कुंजी बाधा

विशेष रूप से, मैं LINQ के माध्यम से सत्रों में एक पंक्ति डाल रहा हूं। मैंने सत्र सेट किया। उपयोगकर्ता = शून्य; और मैं इस त्रुटि मिलती है:

An attempt was made to remove a relationship between a User and a Session. However, one of the relationship's foreign keys (Session.UID) cannot be set to null.

हालांकि, जब मैं लाइन है कि उपयोगकर्ता संपत्ति nulls निकालने के लिए, मैं अपने SubmitChanges लाइन पर इस त्रुटि मिलती है:

Value cannot be null. 
Parameter name: cons

मेरी टेबल में से कोई भी एक क्षेत्र कहा जाता है 'विपक्ष ', और न ही यह मेरी 5,500-लाइन DataContext.designer.cs फ़ाइल में है, न ही यह किसी भी संबंधित ऑब्जेक्ट के लिए क्विकवॉच में है, इसलिए मुझे नहीं पता कि' विपक्ष 'क्या है।

डेटाबेस में, सत्र.यूआईडी एक शून्य से इंटेल फ़ील्ड है और User.ID एक गैर-शून्य है। मैं ऐसे सत्र रिकॉर्ड करना चाहता हूं जो यूआईडी हो या न हो, और मैं उस एफके रिश्ते पर बाधा को अक्षम किए बिना इसे करूंगा। क्या इसे करने का कोई तरीका है?

उत्तर

27

मुझे लगता है कि पहले एक नामुमकिन एफके बनाना याद है, इसलिए मैंने एक त्वरित परीक्षण किया। जैसा कि आप नीचे देख सकते हैं, यह निश्चित रूप से करने योग्य है (एमएसएसएलएल 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 
+7

राइट एडीके। +1 एक विदेशी कुंजी की परिभाषा यह है कि यह एक तालिका में एक मान है जो किसी अन्य तालिका में प्राथमिक कुंजी मान से मेल खाना चाहिए या शून्य होना चाहिए। – Alan

+1

तार्किक रूप से, यह समझ में आता है, है ना? मैंने इसे इस तरह पढ़ा: अगर मैं किसी अन्य तालिका में एक रिकॉर्ड को संदर्भित करने का प्रयास करता हूं, तो सुनिश्चित करें कि संदर्भ मान्य है। अगर मैं नहीं (एनयूएलएल), जो परवाह करता है। –

संबंधित मुद्दे