ऑब्जेक्ट 'DF __ *' कॉलम '*' पर निर्भर है - इंट टू डबल में बदलना


169

मूल रूप से मुझे निम्नलिखित गुणों के साथ अपने EF डेटाबेस में एक तालिका मिली:

public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Image { get; set; }
public string WatchUrl { get; set; }
public int Year { get; set; }
public string Source { get; set; }
public int Duration { get; set; }
public int Rating { get; set; }
public virtual ICollection<Category> Categories { get; set; }

हालाँकि यह ठीक काम करता है जब मैं रेटिंग के इंटेंस को डबल करने के लिए बदलता हूं तो मुझे डेटाबेस को अपडेट करते समय निम्न त्रुटि मिलती है:

ऑब्जेक्ट 'DF_ Movies _Rating__48CFD27E' कॉलम 'रेटिंग' पर निर्भर है। अन्य तालिका में से कोई भी एक या अधिक ऑब्जेक्ट इस स्तंभ तक पहुँचने में विफल रहा है।

मुद्दा क्या है?


1
बाधा DF_Movies_Rating__48CFD27E निकालें और फिर अपने क्षेत्र का प्रकार बदलें
जो तरस

@JoeTaras लेकिन मैंने कभी भी इस नाम की बाधा नहीं बनाई है। यह क्या है और मुझे यह कहां मिल रहा है?
जॉर्डन अक्ष

2
जब आप कोई फ़ील्ड बनाते हैं DBMS स्वचालित रूप से एक बाधा बनाता है। यदि आप अपनी तालिका जानकारी का विस्तार करते हैं, तो बाधा अनुभाग में आप इसे पाएंगे। मुझे बताएं कि क्या आप पाएंगे;)
जो तारास

जवाबों:


252

इसे इस्तेमाल करे:

अपना फ़ील्ड प्रकार बदलने से पहले बाधा DF_Movies_Rating__48CFD27E निकालें ।

बाधा आमतौर पर DBMS (SQL सर्वर) द्वारा स्वचालित रूप से बनाई जाती है।

तालिका से जुड़ी बाधा को देखने के लिए, ऑब्जेक्ट एक्सप्लोरर में तालिका की विशेषताओं का विस्तार करें , इसके बाद नीचे दी गई श्रेणी की बाधाओं को देखें:

अपनी मेज का पेड़

फ़ील्ड प्रकार बदलने से पहले आपको बाधा को दूर करना होगा।


40
@ मनिराज: अपने अनुकूल DROP CONSTRAINT DF_Movies_Rating__48CFD27E को बदलें
जो

18
किस वजह से अड़चन पैदा हुई? मैं उनमें से एक गुच्छा है, और मैं वास्तव में उन्हें नहीं चाहता!
साइमन पार्कर

5
हम्म, और क्या करना चाहिए अगर मैं अपने ढांचे (लारवेल) के डीबी माइग्रेशन का उपयोग करना चाहता हूं और वहां ड्रॉप ड्रॉप करना चाहता हूं? मुझे पता नहीं है कि कैसे बाधा को गिराना है जिसका रहस्यमय नाम है, एसक्यूएल सर्वर द्वारा
ऑटोजेनरेटेड

2
मुझे यकीन है: मैंने इसे छोड़ दिया और फ़ोल्डर की कमी ख़त्म हो गई, और जब मैं एप्लिकेशन चलाता हूं या update-databaseइसे फिर से कॉल करता हूं तो मैंने फिर से इस मुद्दे को पोस्ट किया: stackoverflow.com/questions/40267769/…
mshwf

2
क्यों बिल्ली SQLServer गर्भनिरोधक को स्पष्ट रूप से नहीं छोड़ती है? यह सब के बाद, यह स्पष्ट रूप से बना!
youcantryreachingme

46

यह tsqlतरीका है

 ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E

पूर्णता के लिए, यह सिर्फ एक उत्तर के रूप में @ जो तारास की टिप्पणी को दर्शाता है


46

मैं यह बताने के लिए एक प्रतिक्रिया के रूप में जोड़ रहा हूं कि बाधा कहां से आती है। मैंने इसे टिप्पणियों में करने की कोशिश की, लेकिन इसे अच्छी तरह से संपादित करना मुश्किल है: - /

यदि आप किसी स्तंभ के साथ एक तालिका बनाते हैं (या बदल देते हैं) जिसमें डिफ़ॉल्ट मान हैं तो यह आपके लिए बाधा पैदा करेगा।

उदाहरण के लिए आपकी तालिका में यह हो सकता है:

CREATE TABLE Movie (
    ...
    rating INT NOT NULL default 100
)

यह डिफ़ॉल्ट 100 के लिए बाधा पैदा करेगा।

यदि आप इसके बजाय इसे बनाते हैं

CREATE TABLE Movie (
  name VARCHAR(255) NOT NULL,
  rating INT NOT NULL CONSTRAINT rating_default DEFAULT 100
);

फिर आपको एक अच्छी तरह से नामित बाधा मिलती है जो संदर्भ के लिए आसान है जब आप कहा तालिका में फेरबदल कर रहे हैं।

ALTER TABLE Movie DROP CONSTRAINT rating_default;
ALTER TABLE Movie ALTER COLUMN rating DECIMAL(2) NOT NULL;
-- sets up a new default constraint with easy to remember name
ALTER TABLE Movie ADD CONSTRAINT rating_default DEFAULT ((1.0)) FOR rating;

आप उन अंतिम 2 कथनों को जोड़ सकते हैं ताकि आप कॉलम को बदल दें और एक पंक्ति में बाधा का नाम दें (आपको यह पता लगाना होगा कि यह किसी भी तरह से है)


पहली जगह में सभी बाधाओं का नामकरण करके समस्या से बचने के बारे में जानकारी जोड़ने के लिए धन्यवाद। (यही है, बेतरतीब ढंग से नामित बाधाओं को छोड़ने के मुद्दे से बचें)
youcantryreachingme

22

जैसा कि बाधा का अप्रत्याशित नाम है, आप इसे जाने बिना ही इसे हटाने के लिए विशेष स्क्रिप्ट ( DropConstraint ) लिख सकते हैं (ईएफ 6.1.3 पर परीक्षण किया गया था):

public override void Up()
{    
    DropConstraint();
    AlterColumn("dbo.MyTable", "Rating", c => c.Double(nullable: false));
}

private void DropConstraint()
{
    Sql(@"DECLARE @var0 nvarchar(128)
          SELECT @var0 = name
          FROM sys.default_constraints
          WHERE parent_object_id = object_id(N'dbo.MyTable')
          AND col_name(parent_object_id, parent_column_id) = 'Rating';
          IF @var0 IS NOT NULL
              EXECUTE('ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [' + @var0 + ']')");
}

public override void Down()
{            
    AlterColumn("dbo.MyTable", "Rating", c => c.Int(nullable: false));    
}

यह उत्तर माइग्रेशन-आधारित वातावरण में बहुत अच्छा काम करता है जहाँ आप हार्डकॉर्प नाम की कमी को बर्दाश्त नहीं कर सकते।
मेन्निह लीह

यदि आप AlterColumnX जैसे AlterColumnX के लिए एक आवरण / विस्तार / अतिभारित फ़ंक्शन बनाते हैं - तो आप उस DropConstraint तर्क को वहां शामिल कर सकते हैं - और आप तालिका नाम और स्तंभ नाम में पारित कर सकते हैं ताकि आपको उन्हें फिर से लिखना न पड़े।
N73k

10

MS SQL Studio इस बात का ध्यान रखता है कि आप कॉलम को कब हटाते हैं, लेकिन यदि आपको बाधा डालने की आवश्यकता है तो प्रोग्रामेटिक रूप से यहाँ सरल समाधान है

यहां एक कोड स्निपेट है जो एक कॉलम को डिफ़ॉल्ट बाधा के साथ छोड़ देगा:

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'__ColumnName__' AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
IF EXISTS (SELECT * FROM syscolumns WHERE id=object_id('__TableName__') AND name='__ColumnName__')
EXEC('ALTER TABLE __TableName__ DROP COLUMN __ColumnName__')

बस TableName और ColumnName को उचित मानों से बदलें । आप इसे सुरक्षित रूप से चला सकते हैं, भले ही कॉलम पहले ही गिरा दिया गया हो।

बोनस : यहां विदेशी कुंजी और अन्य प्रकार की बाधाओं को छोड़ने के लिए कोड है।

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '__TableName__' AND COLUMN_NAME = '__ColumnName__')
BEGIN
SELECT @ConstraintName = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '__TableName__' AND COLUMN_NAME = '__ColumnName__'
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
END

ब्लॉग


1
अब दो बार मेरी जान बचाई। उन दोनों को, चेक की कमी को दूर करने के लिए। सबसे पहले मुझे पहली क्वेरी का उपयोग करना है। सभी में से, मुझे दूसरी क्वेरी का उपयोग करना होगा क्योंकि चेक बाधा SYS.DEFAULT_CONSTRAINTS तालिका में नहीं मिली थी। आपका बहुत बहुत धन्यवाद!
रविवार

8

जब हम एक स्तंभ को गिराने की कोशिश करते हैं, जिस पर निर्भर होता है, तब हम इस तरह की त्रुटि देखते हैं:

ऑब्जेक्ट 'DF __ *' कॉलम '' पर निर्भर है।

उस स्तंभ पर निर्भर है जो बाधा को छोड़ें:

ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;

उदाहरण:

Msg 5074, स्तर 16, राज्य 1, पंक्ति 1

ऑब्जेक्ट ' DF__Employees__Colf__1273C1CD' कॉलम 'Colf' पर निर्भर है।

एमएसजी 4922, लेवल 16, स्टेट 9, लाइन 1

एक या अधिक ऑब्जेक्ट इस कॉलम तक पहुँचने के कारण TABLE DROP COLUMN Colf विफल हो गया।

ड्रॉप बाधा (DF__Employees__Colf__1273C1CD):

ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;

फिर आप कॉलम को छोड़ सकते हैं:

Alter Table TableName Drop column ColumnName

1

उपाय :

डेटाबेस तालिका खोलें -> विस्तार तालिका -> बाधाओं का विस्तार करें और इसे देखें

स्क्रीनशॉट


हालांकि यह कोड प्रश्न का उत्तर दे सकता है, क्यों और / या इस कोड के उत्तर के बारे में अतिरिक्त संदर्भ प्रदान करने से प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
डोनाल्ड डक

-1

मेरे पास यह त्रुटि थी कि मैं इसके चारों ओर काम करने के लिए माइग्रेशन चलाने की कोशिश कर रहा हूं, मैंने कॉलम का नाम बदला और उपयोग करके माइग्रेशन फिर से उत्पन्न किया

add-migration migrationname -force

पैकेज मैनेजर कंसोल में। मैं तब दौड़ने में सक्षम था

update-database

सफलतापूर्वक।


2
सावधान रहें, यह किसी स्तंभ का नाम नहीं बदलता है - यह स्तंभ को छोड़ देता है और एक नया स्तंभ जोड़ता है। जब तक आप माइग्रेशन में कस्टम कोड नहीं जोड़ते हैं, तब तक कॉलम में मौजूद किसी भी डेटा को आप खो देंगे।
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.