2013-02-13 11 views

答えて

2

はただ、これは私がmylittlesql経由でのみアクセスすることができ、本番データベース上で起こっていた理由を理解しようとあまりにも多くの時間を費やしました。問題を再現できませんでしたが、sp_renameのビットからこのスクリプトを作成したので、次回に起こったときに正確に理由を見つけることができます。はい、残酷ですが、他の誰かを助けるかもしれません。

sys.columnsに格納されている実際のカラム名に '['または ']'を(カラム名として? 'nvarchar')取得することは、何とかして問題があります。 PARSENAMEは[]に対処せず、nullを返します。したがって、sp_renameは機能しません。 [メッセージ]タブでいくつかの有用なメッセージ(のこの意志出力

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 

これは私がこの問題を持っておく場所であるエラーコード15248と「列」場合の問題を診断するのに役立ちますSSMSなど)と[結果]タブの表のフィールドに表示されます。

幸運。

22

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

7

これは、という名前のためです。名前の競合(モデル)は、他の予約済みまたは生成されたものと競合します。

EFコードファーストでは、2つ以上のテーブルを派生した介入テーブルのテーブル名を使用して関連付けるように介入テーブルを作成することを考慮すると、介入テーブルのような名前を使用するクラス名を使用する場合、あいまいなエラー。あなたが内部モデルのメタデータがQUESTION_ANSWERと呼ばれる参照が含まれています回答ナビゲーションプロパティを持つ質問クラスを持っている場合

例えば

このを解決するために、クラス名を変更しよう(テーブルを生成するために使用されます)、その一意性を保証します。

1

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はその後、外国人を見つけることができ、私が持っていた問題を回避するには、名前の周りに角括弧を使用していましたキー。

+1

新しい名前の角括弧を除外します(以前のとおり)。そうでない場合は名前の一部になります – Savage

0

実際にこのエラーは、データベースを削除しただけで、データベースが存在しないことをコンテキストが認識しない場合にも発生します。

データベースを再作成しましたが、エラーが解決されました。

P.S.

0

私はちょうどリファクタリングの後でも、同じ問題があったことを確認してください。私にとっては、問題はリファクタリングされた移行によっても発生しました。

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

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

関連する問題