2013-02-13 39 views
39

मैं एक मेज EducationTypes नाम दिया है वह गलत है और एक इकाई EducationType नाम है, मैं नाम दिया इकाई संपत्ति में से एक है, अब मैं अक्सर हो रही है Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong । कैसे मैं इस मुद्दे को हल कर सकता हूँ?एफई CodeFirst: या तो पैरामीटर @objname अस्पष्ट है या दावा किया @objtype (स्तंभ)

उत्पन्न एसक्यूएल स्क्रिप्ट:

EXECUTE sp_rename @objname = N'dbo.EducationTypes.nvarchar', @newname = N'EducationTypeTitle', @objtype = N'COLUMN' 

उत्तर

2

बस क्यों यह एक उत्पादन डेटाबेस मैं mylittlesql के माध्यम से ही पहुंचा जा सकता है पर हो रहा था पता लगाने की कोशिश अभी तक भी काफी समय बिताया। समस्या को पुन: उत्पन्न नहीं कर सका लेकिन इस स्क्रिप्ट को sp_rename के बिट्स से बनाया गया ताकि जब अगली बार ऐसा हो जाए तो मैं वास्तव में क्यों पता लगा सकता हूं। हाँ अधिक है, लेकिन किसी और की मदद कर सकता है।

यदि आप किसी भी तरह से sys.columns में संग्रहीत वास्तविक कॉलम नाम में '[' या ']' प्राप्त करने का प्रबंधन करते हैं, तो? (? 'Nvarchar' आपके कॉलम नाम के रूप में ????) कोई समस्या है। PARSENAME [] के साथ सामना नहीं करता है और शून्य देता है, इसलिए sp_rename काम नहीं करेगा।

यह केवल मदद मिलेगी त्रुटि कोड 15248 है जो जहां मैं इस समस्या आ रही के साथ 'कॉलम' मामले के लिए समस्या का निदान:

declare @objname nvarchar(1035) = N'dbo.EducationTypes.nvarchar' -- input to sp_rename 
declare @newname sysname = N'EducationTypeTitle' -- input to sp_rename 

declare @UnqualOldName sysname, 
@QualName1  sysname, 
@QualName2  sysname, 
@QualName3  sysname, 
@OwnAndObjName nvarchar(517), 
@SchemaAndTypeName nvarchar(517), 
@objid   int, 
@xtype   nchar(2), 
@colid   int, 
@retcode  int 

select @UnqualOldName = parsename(@objname, 1), 
     @QualName1 = parsename(@objname, 2), 
     @QualName2 = parsename(@objname, 3), 
     @QualName3 = parsename(@objname, 4) 
print 'Old Object Name = ''' + convert(varchar,isnull(@UnqualOldName ,'')) + '''' 
-- checks that parsename is getting the right name out of your @objname parameter 
print 'Table name:' 
if @QualName2 is not null 
begin 
print QuoteName(@QualName2) +'.'+ QuoteName(@QualName1) 
select @objid = object_id(QuoteName(@QualName2) +'.'+ QuoteName(@QualName1)) 
end 
else 
begin 
print QuoteName(@QualName1) 
select @objid = object_id(QuoteName(@QualName1)) 
end 
-- check if table is found ok 
print 'Table Object ID = ''' + convert(varchar,isnull(@objid ,-1)) + '''' 
select @xtype = type from sys.objects where object_id = @objid 
print '@xtype = ''' + convert(varchar,isnull(@xtype,'')) + ''' (U or V?)' 
if (@xtype in ('U','V')) 
begin 
print 'select @colid = column_id from sys.columns where object_id = ' + 
    convert(varchar,isnull(@objid,0)) + ' and name = ''' + 
     @UnqualOldName + '''' 

    select * from sys.columns where object_id = @objid -- and name = @UnqualOldName 
    select @colid = column_id from sys.columns 
    where object_id = @objid and name = @UnqualOldName 
    print 'Column ID = ''' + convert(varchar,isnull(@colid,-1)) + '''' 
end 

हो जाएगा ताकि उत्पादन संदेश टैब में कुछ उपयोगी संदेश (की एसएसएमएस या जो भी आप उपयोग कर रहे हैं) और परिणाम टैब में तालिका फ़ील्ड।

शुभकामनाएं।

22

यदि आप पहले कोड का उपयोग कर रहे हैं और (ए) मौजूदा माइग्रेशन स्क्रिप्ट (ओं) हैं और एक परिवर्तन को ओवरराइट करने की कोशिश कर रहे हैं (यानी एक कॉलम का नाम बदलना) जिसे हटा दिया गया है, तो आपको वह त्रुटि आउटपुट मिलेगा। माइग्रेशन स्क्रिप्ट, NuGet के माध्यम से एड-माइग्रेशन को हटाने और फिर डेटाबेस को अद्यतन करने का सबसे आसान तरीका है।

7

यह नाम के कारण क्लास (मॉडल) नाम अन्य आरक्षित या जेनरेट किए गए लोगों के साथ है, जब ऑटो टेबल बनाता है और ...।

यह ध्यान में रखते हुए कि ईएफ कोड पहले हस्तक्षेप तालिका के लिए टेबल के नाम का उपयोग करके 2 या अधिक तालिकाओं को जोड़ने के लिए हस्तक्षेप तालिकाओं को बनाता है, इसलिए जब आप कक्षा नाम का उपयोग करते हैं जो हस्तक्षेप तालिकाओं जैसे नाम को नियोजित करता है, तो हमें यह मिल जाएगा संदिग्ध त्रुटि।

उदाहरण के लिए यदि आप एक प्रश्न वर्ग है जो एक उत्तर नेविगेशन संपत्ति आंतरिक मॉडल मेटाडाटा एक संदर्भ QUESTION_ANSWER कहा जाता है में शामिल होंगे है है

इस हल करने के लिए, वर्ग के नाम को बदलने की कोशिश (टेबल बनाने के लिए प्रयोग किया जाता है) और उनकी विशिष्टता सुनिश्चित करें।

1

मुझे एसक्यूएल ("...") विधि का उपयोग करके मेरी माइग्रेशन स्क्रिप्ट में एक विदेशी कुंजी का नाम बदलने का प्रयास करते समय इसे एंटिटी फ्रेमवर्क 6 के साथ मिला। यानी इस बदलते

:

sp_rename 'FK_dbo.tablename_dbo.othertablename_fieldname', 'FK_dbo.tablename_dbo.othertablenewname_fieldnewname', 'object' 

... यह करने के लिए:

sp_rename '[FK_dbo.tablename_dbo.othertablename_fieldname]', 'FK_dbo.tablename_dbo.othertablenewname_fieldnewname', 'object' 

एसक्यूएल सर्वर तो विदेशी ढूँढने में सक्षम है वैकल्पिक हल मैं था नाम चारों ओर वर्ग कोष्ठक का उपयोग किया गया कुंजी।

+1

और नए नाम पर ब्रैकेट को बाहर निकालें (जैसा आपने किया है), अन्यथा वे नाम का हिस्सा बन जाते हैं – Savage

0

वास्तव में यह त्रुटि तब भी होती है जब आपने डेटाबेस को हटा दिया, और आपके संदर्भ को यह नहीं पता कि आपका डेटाबेस वहां नहीं है।

मैंने डेटाबेस को फिर से बनाया, और अब त्रुटि हल हो गई थी।

पीएस सुनिश्चित करें कि जब आप अद्यतन-डेटाबेस

0

चलाने का प्रयास करते हैं, तो डेटाबेस को जांचने का प्रयास करें, फिर भी मुझे एक ही समस्या थी, फिर भी रिफैक्टरिंग के बाद। मेरे लिए, समस्या माइग्रेशन के कारण हुई थी जिसे पुन: संसाधित किया गया था।

परिणाम यह था कि एक और माइग्रेशन निष्पादित नहीं किया जा सका क्योंकि वह माइग्रेशन अपने पुराने नाम को खोजकर एक टेबल की तलाश में था।

माइग्रेशन में परिवर्तनों को वापस करने से इस समस्या को हल किया गया।