2013-02-13 11 views
39

Ho una tabella denominata EducationTypes ed un'entità denominata EducationType, ho rinominato una delle proprietà di entità, ora sto ricevendo spesso Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong . Come posso risolvere questo problema?EF CodeFirst: o il parametro @objname è ambiguo o @objtype dichiarata (colonna) è sbagliato

lo script SQL generato:

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

risposta

2

appena trascorso troppo tempo a cercare di capire il motivo per cui questo stava accadendo su un database di produzione che può accedere solo tramite mylittlesql. Non è stato possibile riprodurre il problema ma ho creato questo script da bit di sp_rename, così quando succede la prossima volta riesco a scoprire esattamente perché. Sì è eccessivo, ma potrebbe aiutare qualcun altro.

C'è un problema se in qualche modo riesci a ottenere '[' o ']' nel nome della colonna reale come memorizzato in sys.columns, (? 'Nvarchar' come nome della colonna ????). PARSENAME non gestisce [] e restituisce null, quindi sp_rename non funzionerà.

Questo sarà solo aiutare a diagnosticare il problema per il caso 'colonna' con il codice di errore 15248 che è dove io continuo ad avere questo problema:

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 

Questo stamperà alcuni messaggi utile nella scheda Messaggi (di SSMS o qualsiasi altra cosa si sta utilizzando) e i campi della tabella nella scheda Risultati.

Buona fortuna.

22

Se si utilizza Code First e si dispone di uno (a) script di migrazione esistente e si sta tentando di sovrascrivere una modifica (ad esempio, rinominare una colonna) che è stata eliminata, verrà visualizzato l'output di errore. Il modo più semplice è quello di eliminare lo script di migrazione, aggiungere la migrazione tramite NuGet e quindi aggiornare il database.

7

Questo a causa del nome Nome conflitto (modello) con altri riservati o generati, quando viene creata automaticamente le tabelle e ....

Considerando che il codice EF innanzitutto crea le tabelle di interveni per correlare 2 o più tabelle usando il nome di tabelle per la tabella di intervenienza derivata, quindi quando si utilizza un nome di classe che utilizza un nome come le tabelle di interveni, otterremo tale errore ambiguo.

Per esempio, se si dispone di un domanda classe che ha una proprietà navigazione risposta metadati modello interno conterrà un riferimento chiamato QUESTION_ANSWER

Per risolvere questo, provare a cambiare i nomi delle classi (utilizzato per generare tabelle) e garantire la loro unicità.

1

Ho ottenuto questo con Entity Framework 6 quando si tenta di rinominare una chiave esterna nel mio script di migrazioni utilizzando il metodo Sql ("..."). La soluzione che ho avuto è stato quello di usare le parentesi quadre attorno al nome:

cioè cambiare questo:

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

... a questo:

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

SQL Server è quindi in grado di trovare l'estero chiave.

+1

E esclude le parentesi sul nuovo nome (come hai fatto), altrimenti diventano parte del nome – Savage

0

In realtà questo errore si verifica anche quando si elimina il database e il contesto non si rende conto che il database non è presente.

Ho ricreato il database e ora l'errore è stato risolto.

P.S. assicurati di controllare che il database sia ancora presente quando provi a eseguire il database di aggiornamento

0

Ho appena avuto lo stesso problema, anche dopo il refactoring. Per me, il problema è stato causato da una migrazione che è stata sottoposta a refactoring.

Il risultato è stato che non è stato possibile eseguire un'altra migrazione perché la migrazione cercava un tavolo cercando il suo vecchio nome.

L'annullamento delle modifiche nella migrazione ha risolto questo problema.

Problemi correlati