web-dev-qa-db-ja.com

EF CodeFirst:パラメーター@objnameがあいまいであるか、要求された@objtype(COLUMN)が間違っています

EducationTypesという名前のテーブルとEducationTypeという名前のエンティティを持っているので、エンティティプロパティの1つを名前変更しました。今では頻繁に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'
47
saber

Code Firstを使用していて、既存の移行スクリプトがあり、削除された変更(つまり、列の名前を変更する)を上書きしようとすると、そのエラー出力が表示されます。最も簡単な方法は、移行スクリプト、NuGetを介したAdd-Migrationを削除してから、データベースを更新することです。

30
RizJa

これは、クラスの競合(モデル)名が他の予約済みまたは生成されたものと、自動でテーブルおよび...を作成するためです。

EF Code Firstが介在テーブルを作成し、派生介在テーブルのテーブル名を使用して2つ以上のテーブルを関連付けることを考慮すると、介在テーブルのような名前を使用するクラス名を使用すると、このようなあいまいなエラーが発生します。

たとえば、QuestionクラスにAnswerナビゲーションプロパティがある場合内部モデルのメタデータには、QUESTION_ANSWERという参照が含まれます

これを解決するには、クラス名(テーブルの生成に使用)を変更して、一意性を確保してください。

10

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は外部キーを見つけることができます。

3
garryp

Mylittlesql経由でしかアクセスできない本番データベースでこれが起こっている理由を理解しようとして、あまりにも多くの時間を費やしました。問題を再現できませんでしたが、sp_renameの一部からこのスクリプトを作成したので、次回それが発生したときに、正確な理由を見つけることができます。はいは過剰ですが、他の誰かを助けるかもしれません。

Sys.columnsに格納されている実際の列名に「[」または「]」をどうにかして入れると問題が発生します(列名として「?」 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または使用中の)[メッセージ]タブと[結果]タブのテーブルフィールドに役立つメッセージが出力されます。

幸運を。

2
MDWeb

移行タイトルの予約語やクラス名を避けてください。

これは、移行に「Init」という名前を付けたときに起こりました-「InitialCreate」に名前を変更し、すべてが完全に機能しました

1
ShhTot

リファクタリング後も同じ問題が発生しました。私にとっては、リファクタリングされた移行によっても問題が発生しました。

その結果、移行は古い名前を検索してテーブルを探していたため、別の移行を実行できませんでした。

移行の変更を元に戻すと、この問題は解決しました。

1
Br2

私にそれが起こったとき:

  • 新しい移行(migratoin1)を追加しました
  • ローカルデータベースで更新
  • 次に、同じ移行(migratoin1)を削除しました
  • 次に、同じ名前(migratoin1)で別の移行を追加しました
  • 次に、ローカルデータベースに適用して公開します。

移行ファイル(migratoin1)を削除すると、問題が解決しました。

0
Sapan Ghafuri

実際にこのエラーは、データベースを削除したばかりのときにも発生し、コンテキストはデータベースがそこにないことを認識しません。

データベースを再作成したところ、エラーは解決しました。

追伸update-databaseを実行するときに、データベースがまだ存在することを確認してください

0
radu florescu