2013-02-13 11 views
39

Mam tabelę o nazwie EducationTypes oraz podmiot o nazwie EducationType, ja przemianowany jedna z właściwości podmiotu, teraz jestem coraz częściej Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong . Jak mogę rozwiązać ten problem?EF CodeFirst: Albo @objname parametr jest niejednoznaczny lub zastrzeżony @objtype (kolumna) jest źle

wygenerowany skrypt SQL:

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

Odpowiedz

2

Właśnie spędziłem zbyt wiele czasu próbuje dowiedzieć się, dlaczego tak się dzieje na bazie produkcyjnej mogę dostęp tylko poprzez mylittlesql. Nie udało się odtworzyć problemu, ale utworzyłem skrypt z bitów sp_rename, więc gdy to nastąpi następnym razem, będę mógł dokładnie ustalić, dlaczego. Tak, to przesada, ale może pomóc komuś innemu.

Wystąpił problem, jeśli kiedykolwiek zdołałeś jakoś wprowadzić "[" lub "]" w rzeczywistą nazwę kolumny zapisaną w pliku sys.columns, (? 'Nvarchar' jako twoją nazwę kolumny ????). PARSENAME nie radzi sobie z wartościami [] i zwraca wartość null, więc sp_rename nie będzie działać.

Pomoże to tylko zdiagnozować problem dla „kolumny” przypadku z kodem błędu 15248 czyli tam, gdzie trzymam posiadające ten problem:

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 

Wyjście to będzie kilka pomocnych wiadomości w zakładce Wiadomości (z SSMS lub cokolwiek, czego używasz) i pola tabeli na karcie Wyniki.

Powodzenia.

22

Jeśli używasz kodu Najpierw i masz (być) istniejące skrypty migracji i próbujesz nadpisać zmianę (tj. Zmianę nazwy kolumny), która została usunięta, otrzymasz wynik błędu. Najprostszym sposobem jest usunięcie skryptu migracji, Add-Migration via NuGet, a następnie aktualizacja bazy danych.

7

To z powodu nazwy Konflikt nazwy klasy (modelu) z innymi zarezerwowanymi lub wygenerowanymi, gdy auto tworzy tabele i ....

Biorąc pod uwagę, że kod EF Najpierw tworzy tablice interweniujące, aby powiązać 2 lub więcej tabel przy użyciu nazw tabel dla pochodnej tabeli interweniowania, więc gdy użyjesz nazwy klasy, która zatrudnia nazwę taką jak tablice interweniujące, otrzymamy takie informacje. niejednoznaczny błąd.

Na przykład, jeśli masz Pytanie klasę, która ma odpowiedzi własność nawigację wewnętrzne metadane model będzie zawierać odniesienie nazwie QUESTION_ANSWER

Aby rozwiązać ten, spróbuj zmienić nazwy klas (używane do generowania tabel) i zapewniają ich wyjątkowość.

1

Mam to z Entity Framework 6 podczas próby zmiany nazwy klucza obcego w moim skrypcie migracji przy użyciu metody Sql ("..."). Obejście miałam używać nawiasów kwadratowych wokół nazwy:

tj zmieniając w ten sposób:

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

... do tego:

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

SQL Server jest wtedy w stanie znaleźć obcy klawisz.

+1

I wyklucz nawiasy klamrowe pod nową nazwą (tak jak to robiłeś), w przeciwnym razie stają się częścią nazwy – Savage

0

W rzeczywistości ten błąd występuje również po usunięciu bazy danych, a kontekst użytkownika nie zdaje sobie sprawy, że nie ma tam bazy danych.

Odtworzyłem bazę danych, a teraz błąd został rozwiązany.

P.S. upewnij się, że baza danych jest nadal dostępna podczas próby uruchomienia bazy danych aktualizacji

0

Po prostu miałem ten sam problem, także po refaktoryzacji. Dla mnie problem został spowodowany również przez migrację, która została również refaktoryzowana.

Wynikiem było to, że nie można było wykonać innej migracji, ponieważ ta migracja szukała tabeli, wyszukując jej starą nazwę.

Przywrócenie zmian w migracji rozwiązało ten problem.

Powiązane problemy