EF CodeFirst:参数@objname不明确或声明的@objtype(COLUMN)错误

我有一个名为EducationTypes的表和一个名为EducationTypes的实体,我重命名了一个实体属性,现在我经常得到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' 

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

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

考虑到EF Code First使用派生干涉表的表名称来创build干涉表来关联两个或多个表,所以当你使用一个类似名字的类名时,我们会得到这样的模糊错误。

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

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

只是花了太多的时间,试图找出为什么这是发生在生产数据库我只能通过mylittlesql访问。 不能重现这个问题,而是从sp_rename的位创build这个脚本,所以当它发生下一次我可以找出到底是为什么。 是的是过度杀伤,但可能会帮助别人。

如果你以某种方式设法将'['或']'存储在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 

这将在“消息”选项卡(SSMS或任何您正在使用的)和“结果”选项卡中的表字段中输出一些有用的消息。

祝你好运。

我尝试使用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然后能够find外键。

其实这个错误也会发生,当你刚刚删除数据库,你的上下文没有意识到你的数据库不存在。

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

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

我也有同样的问题,也是在重构之后。 对我来说,这个问题是由于重构的迁移造成的。

结果是另一个迁移无法执行,因为迁移通过search旧名称来查找表。

恢复迁移中的更改解决了此问题。