'DF __ *' অবজেক্টটি কলাম '*' এর উপর নির্ভরশীল - ডাবলিতে int পরিবর্তন করা


168

মূলত আমি আমার 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_ মুভিজ _ রেটিং__48 CFD27E' অবজেক্টটি কলাম 'রেটিং' এর উপর নির্ভরশীল। ALTER TABLE ALTER COLUMN রেটিং ব্যর্থ হয়েছে কারণ এক বা একাধিক বস্তু এই কলামটিতে অ্যাক্সেস করে।

ব্যাপারটা কি?


1
সীমাবদ্ধতা DF_Movies_ রেটিং__48CFD27E সরিয়ে ফেলুন এবং তারপরে আপনার ক্ষেত্রের ধরণটি পরিবর্তন করুন
জো

@ জোতারাস তবে আমি কখনও নামটির প্রতিবন্ধকতা সৃষ্টি করি নি। এটি কী এবং আমি এটি কোথায় খুঁজে পাব?
জর্দান এক্স

2
আপনি যখন একটি ক্ষেত্র তৈরি করেন DBMS স্বয়ংক্রিয়ভাবে একটি সীমাবদ্ধতা তৈরি করে। আপনি যদি আপনার টেবিলের তথ্য প্রসারিত করেন তবে সীমাবদ্ধ বিভাগে আপনি এটি খুঁজে পাবেন। যদি আপনি খুঁজে পান তবে আমাকে বলুন;)
জো তারস

উত্তর:


252

এটা চেষ্টা কর:

আপনার ক্ষেত্রের ধরণ পরিবর্তন করার আগে সীমাবদ্ধতা DF_Movies_Rating__48CFD27E সরিয়ে দিন।

সীমাবদ্ধতা সাধারণত ডিবিএমএস (এসকিউএল সার্ভার) দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয়।

টেবিলের সাথে জড়িত সীমাবদ্ধতা দেখতে, অবজেক্ট এক্সপ্লোরারে টেবিলের বৈশিষ্ট্যগুলি প্রসারিত করুন , নীচে দেখানো অনুসারে বিভাগ সীমাবদ্ধতা অনুসরণ করুন :

আপনার টেবিল গাছ

ক্ষেত্রের ধরণ পরিবর্তন করার আগে আপনাকে অবশ্যই প্রতিবন্ধকতা সরিয়ে ফেলতে হবে।


40
@ মানিরাজ এসএসএস: আপনার টেবিল ড্রপ কনট্রিন্টে টেবিলটি ডিএফ_মোভিজ_ রেটিং রেটিং__48 সিএফডি 27 ই
জো

18
সীমাবদ্ধতা তৈরির কারণ কি ঘটেছে? আমি তাদের একগুচ্ছ আছে, এবং আমি সত্যিই তাদের চাই না!
সাইমন পার্কার

5
হুম, এবং আমি যদি সেখানে আমার ফ্রেমওয়ার্ক (লারাভেল) এবং ড্রপ কলামের ডিবি স্থানান্তর ব্যবহার করতে চাই তবে কী করব? এসকিউএল সার্ভার দ্বারা
স্বয়ংক্রিয়ভাবে জড়িত

2
আমি নিশ্চিত, আমি droped এটা এবং ফোল্ডার সীমাবদ্ধতাসমূহ খালি হয়ে ওঠে এবং যখন আমি অ্যাপ্লিকেশন চালানোর বা কল update-databaseএটা আবার নিজেই পুনঃ আমি এই বিষয় পোস্ট stackoverflow.com/questions/40267769/...
mshwf

2
কেন হ্যাক এসকিউএল সার্ভার অন্তর্ভুক্তভাবে কনট্রিন্টটি বাদ দেয় না? এটি, সর্বোপরি, এটি স্পষ্টভাবে তৈরি!
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 টি স্টেটমেন্টগুলি একত্রিত করতে পারেন যাতে আপনি কলামটি পরিবর্তন করেন এবং এক লাইনে সীমাবদ্ধতার নাম রাখুন (এটি যদি কোনও বিদ্যমান টেবিল যাইহোক হয় তবে আপনাকে করতে হবে)


প্রথম স্থানে সমস্ত প্রতিবন্ধকতার নাম দিয়ে সমস্যাটি কীভাবে এড়ানো যায় সে সম্পর্কে তথ্য যুক্ত করার জন্য ধন্যবাদ Thanks (এটি, এলোমেলোভাবে নামকরণের প্রতিবন্ধকতাগুলি বাদ দেওয়ার বিষয়টি এড়িয়ে চলুন)
youcantryreachingme

22

বাধাটির অপ্রত্যাশিত নাম রয়েছে বলে আপনি নামটি না জেনে এটি সরাতে বিশেষ স্ক্রিপ্ট ( ড্রপকন্ট্রেন্ট ) লিখতে পারেন (EF 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));    
}

এই উত্তরটি মাইগ্রেশন-ভিত্তিক পরিবেশে দুর্দান্ত কাজ করে যেখানে আপনি সীমাবদ্ধতার নাম হার্ডকোড করতে পারবেন না।
মেনিয়ন লিয়া

যদি আপনি অ্যালটারকলাম - যেমন অল্টারক্ল্যামএক্সএক্সের জন্য একটি মোড়ক / এক্সটেনশন / ওভারলোডেড ফাংশন করেন তবে আপনি সেই ড্রপকন্সট্রিন্ট যুক্তিটি সেখানে অন্তর্ভুক্ত করতে পারেন - এবং আপনি টেবিলের নাম এবং কলামের নামটিতে পাস করতে পারেন যাতে আপনাকে আবার লিখতে না হয়।
N73k

10

এমএস এসকিউএল স্টুডিও আপনি কলামটি মুছবেন সেদিকে খেয়াল রাখবেন তবে প্রোগ্রামাগতভাবে আপনার যদি সীমাবদ্ধতা মুছতে হয় তবে এখানে সহজ সমাধান

এখানে একটি কোড স্নিপেট রয়েছে যা একটি কলামটি ডিফল্ট সীমাবদ্ধতার সাথে ফেলে দেবে:

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__')

উপযুক্ত মানগুলির সাথে কেবল টেবিলনাম এবং কলামনাম প্রতিস্থাপন করুন । কলামটি ইতিমধ্যে বাদ দেওয়া থাকলেও আপনি নিরাপদে এটি চালাতে পারেন।

বোনাস : বিদেশী কী এবং অন্যান্য ধরণের প্রতিবন্ধকতা ফেলে দেওয়ার কোড এখানে।

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;

উদাহরণ:

এমএসজি 5074, স্তর 16, রাজ্য 1, লাইন 1

' DF__Employees__Colf__1273C1CD' অবজেক্টটি ' কলফ' কলামের উপর নির্ভরশীল।

এমএসজি 4922, স্তর 16, রাজ্য 9, লাইন 1

টেবিল ড্রপ কলম কলফ ব্যর্থ হয়েছে কারণ এক বা একাধিক বস্তু এই কলামটিতে অ্যাক্সেস করেছে।

ড্রপ বাধা (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
সাবধানতা অবলম্বন করুন, এটি কোনও কলামটির নাম পরিবর্তন করে না - এটি কলামটি ড্রপ করে একটি নতুন কলাম যুক্ত করে। আপনি যে কোনও ডেটা হারাবেন যা কলামটিতে বিদ্যমান ছিল না যদি না আপনি মাইগ্রেশনে কাস্টম কোড না যোগ করেন।
সিএসে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.