59

我有一个名为的表EducationTypes和一个名为 的实体EducationType,我重命名了一个实体属性,现在我经常得到Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong. 我该如何解决这个问题?

生成的 SQL 脚本:

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

12 回答 12

33

如果您使用 Code First 并且拥有(一个)现有的迁移脚本并试图覆盖已被删除的更改(即重命名列),那么您将获得该错误输出。最简单的方法是删除迁移脚本,通过 NuGet 添加-迁移,然后更新数据库。

于 2014-10-13T18:45:38.020 回答
12

这是因为当自动创建表和 ... 时,类(模型)名称与其他保留或生成的名称冲突。

考虑到 EF Code First 创建干预表以使用派生干预表的表名关联 2 个或多个表,因此当您使用使用类似于干预表的名称的类名时,我们会得到这样的模棱两可的错误。

例如,如果您有一个具有Answer导航属性的Question类,则内部模型元数据将包含一个名为QUESTION_ANSWER的引用

要解决这个问题,请尝试更改类名(用于生成表)并确保它们的唯一性。

于 2015-02-16T17:26:08.293 回答
3

当我尝试使用 Sql(" ... ") 方法在我的迁移脚本中重命名外键时,我在 Entity Framework 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'

SQL Server 然后能够找到外键。

于 2015-11-19T12:08:32.383 回答
2

只是花了太多时间试图弄清楚为什么在我只能通过 mylittlesql 访问的生产数据库上发生这种情况。无法重现该问题,但从 sp_rename 的位中制作了此脚本,因此下次确实发生时,我可以确切地找出原因。是的有点矫枉过正,但可能会帮助其他人。

如果您以某种方式设法将 '[' 或 ']' 放入存储在 sys.columns 中的实际列名中,则会出现问题(?'nvarchar' 作为您的列名????)。PARSENAME 无法处理 [] 并返回 null,因此 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

这将在 Messages 选项卡(SSMS 或您正在使用的任何内容)和 Results 选项卡中的表字段中输出一些有用的消息。

祝你好运。

于 2013-10-12T05:27:23.720 回答
2

我只是在重构之后也遇到了同样的问题。对我来说,问题是由重构的迁移引起的。

结果是无法执行另一个迁移,因为该迁移正在通过搜索表的旧名称来查找表。

还原迁移中的更改解决了这个问题。

于 2016-08-26T14:27:33.373 回答
2

避免在迁移标题中使用保留字或类名。

当我将迁移命名为“Init”时,这发生在我身上 - 重命名为“InitialCreate”并且一切正常

于 2018-09-04T18:13:53.077 回答
0

当我首先使用代码更新数据库时出现此错误。我用外键创建了一个表,其他人重命名了该外键。现在当我尝试更新数据库时,它抛出了这个异常。

我执行了这些步骤来克服这个问题:

  • 不得不从我的数据库中删除该表
  • 跟踪哪个迁移添加了该表并将其从 SQL Server 的迁移历史记录中删除
  • 最后再次运行 update-database 并且我的数据库成功更新。
于 2022-02-24T11:49:42.500 回答
0

对我来说,它发生在:

  • 添加了新的迁移 (migatoin1)
  • 在本地数据库上更新
  • 然后删除了相同的迁移(migatoin1)
  • 然后添加同名(migatoin1)另一个迁移
  • 然后应用到本地数据库并发布。

删除迁移文件(migatoin1)解决了我的问题。

于 2019-03-12T15:55:06.790 回答
0

我刚刚遇到这个错误并解决了修改迁移部分类的问题,迁移尝试重命名索引并且索引不存在,我只是像这样更改迁移代码:

  1. 删除索引方法上的重命名
  2. 在 Up void 中设置创建索引
  3. 在 Down void 中设置 drop index

这解决了我的问题。

于 2021-12-03T01:00:43.190 回答
0

实际上,当您刚刚删除数据库时也会发生此错误,并且您的上下文没有意识到您的数据库不存在。

我重新创建了数据库,现在错误已解决。

PS确保在尝试运行更新数据库时检查数据库是否仍然存在

于 2016-01-01T17:48:41.307 回答
-1

我通过从 SQL Server 中的“我的数据库迁移历史记录”表中删除所有旧迁移,然后添加一个新迁移来解决此错误,但仅用于所需的更改,然后更新数据库。它工作正常。

于 2020-05-30T23:37:02.370 回答
-1

这发生在我身上,因为自动迁移被设置为 true,并且其中一位新添加迁移到项目的程序员在更新数据库时会感到困惑。通过从项目中删除现有迁移并再次依靠自动更新来解决它。

于 2020-08-21T13:49:59.813 回答