Подтвердить что ты не робот

EF CodeFirst: либо параметр @objname неоднозначен, либо заявленный код @objtype (COLUMN) ошибочен

У меня есть таблица с именем EducationTypes и Entity с именем EducationType, я переименовал одно из свойств сущности, теперь я часто получаю Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong. Как я могу решить эту проблему?

Сгенерированный SQL Script:

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

Ответ 1

Если вы используете Code First и имеете (существующий) Migration script (s) и пытаетесь перезаписать изменение (например, переименование столбца), которое с тех пор было удалено, тогда вы получите этот вывод ошибки, Самый простой способ - удалить перенос script, Add-Migration через NuGet, а затем обновить базу данных.

Ответ 2

Это связано с именем Conflict of Class (Model) с другими зарезервированными или сгенерированными, когда auto создает таблицы и....

Учитывая, что EF-код сначала создает таблицы промежуточных элементов для привязки двух или более таблиц, используя имя таблиц для производной таблицы интервенций, поэтому, когда вы используете имя класса, которое использует имя, подобное таблицам интервенций, мы получим такой двусмысленный ошибка.

Например, если у вас есть класс Question, у которого есть свойство навигации Answer, внутренние метаданные модели будут содержать ссылку под названием QUESTION_ANSWER

Чтобы решить эту проблему, попробуйте изменить имена классов (используемые для генерации таблиц) и обеспечить их уникальность.

Ответ 3

Я получил это с Entity Framework 6 при попытке переименовать внешний ключ в моих миграциях script с использованием метода Sql ( "..." ). Обходной путь, который у меня был, заключался в том, чтобы использовать квадратные скобки вокруг имени:

то есть. изменив это:

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'

Затем SQL Server может найти внешний ключ.

Ответ 4

Просто потратил слишком много времени, пытаясь понять, почему это происходит в производственной базе данных, к которой я могу получить доступ только через mylittlesql. Не удалось воспроизвести проблему, но сделал это script из бит sp_rename, поэтому, когда это произойдет в следующий раз, я смогу точно выяснить, почему. Да, это слишком много, но может помочь кому-то другому.

Возникла проблема, если вам когда-нибудь удастся получить '[' или ']' в фактическое имя столбца, как хранится в sys.columns(? 'nvarchar' в качестве имени столбца????). PARSENAME не справляется с [] и возвращает null, поэтому sp_rename не будет работать.

Это поможет только диагностировать проблему для случая "column" с кодом ошибки 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

Это приведет к появлению некоторых полезных сообщений на вкладке "Сообщения" (SSMS или независимо от того, что вы используете) и полей таблицы на вкладке "Результаты".

Удачи.

Ответ 5

У меня была одна и та же проблема, также после рефакторинга. Для меня проблема была вызвана миграцией, которая также была реорганизована.

В результате не удалось выполнить другую миграцию, потому что эта миграция искала таблицу, ища ее старое имя.

Отмена изменений в миграции решила эту проблему.

Ответ 6

Держитесь подальше от зарезервированных слов или имен классов в заголовке миграции.

Это случилось со мной, когда я назвал миграцию "Init" - переименовал в "InitialCreate", и все работало отлично

Ответ 7

Собственно эта ошибка также возникает, когда вы просто удалили базу данных, и ваш контекст не понимает, что вашей базы данных нет.

Я воссоздал базу данных, и теперь ошибка была решена.

P.S. убедитесь, что вы проверяете базу данных по-прежнему, когда вы пытаетесь запустить базу данных обновлений

Ответ 8

Со мной это случилось, когда:

  • Добавлена новая миграция (migratoin1)
  • Обновлено в локальной базе данных
  • Затем удалил ту же миграцию (migratoin1)
  • Затем добавили с тем же именем (migratoin1) еще одну миграцию
  • Затем применяется к локальной базе данных и публикуется.

Удаление файла миграции (migratoin1) решило мою проблему.

Ответ 9

Смотрите, индекс существует в базе данных. Я создаю индекс в базе данных и запускаю обновление сущности, у меня работает.