以前は EF 4.3 を使用していましたが、5.0 にアップグレードすると、インデックス、FK 制約、および PK 制約のすべての命名規則が dbo を含むように変更されていることがわかりました (たとえば、PK_Users は PK_dbo.Users になりました)。
モデルに変更を加え、これらを含むテーブルを変更する必要があるときはいつでも、制約が見つからないため、制約を削除できないと常に言います。
制約/インデックス/キーを削除しようとすると、最初に5.0より前の名前が存在するかどうかを確認し、存在する場合は削除しますが、新しい5.0の命名規則を使用して再作成するようにしたいだけです。
命名規則は 4.3 から 5.0 で次のように変更されました。
主キー/インデックス
Old: PK_Users New: PK_dbo.Users
外部キー
Old: FK_Users_Roles_Role_Id New: FK_dbo.Users_dbo.Roles_Role_Id
注: 単に EF にすべてのテーブルを再生成させることはできません。このデータベースには運用データがあります。また、カスタム マイグレーションを使用してすべてのテーブルに対してこれを手動で行う必要もありません。
編集: 同様の質問を見つけました。How can I stop Entity Framework 5 migrations added dbo. キー名に?しかし、この男は 5.0 の規則を無視して 4.3 に固執したかっただけで、テーブルの名前変更だけを扱っていました。EFの後続のバージョンでは、このコードに影響を与える変更がさらに発生する可能性があり、後で面倒になる可能性があるため、これは避けたいと思います。
投稿された回答と同じ流れで何かをやってみました:
public class CodeMigrator : CSharpMigrationCodeGenerator
{
protected override void Generate(
DropIndexOperation dropIndexOperation, IndentedTextWriter writer)
{
dropIndexOperation.Name = StripDbo(dropIndexOperation.Name);
base.Generate(dropIndexOperation, writer);
}
protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation, IndentedTextWriter writer)
{
dropForeignKeyOperation.Name = StripDbo(dropForeignKeyOperation.Name);
base.Generate(dropForeignKeyOperation, writer);
}
protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation, IndentedTextWriter writer)
{
dropPrimaryKeyOperation.Name = StripDbo(dropPrimaryKeyOperation.Name);
base.Generate(dropPrimaryKeyOperation, writer);
}
// TODO: Override other Generate overloads that involve table names
private string StripDbo(string name)
{
return name.Replace("dbo.", "");
}
}
そしてそれを構成に追加します:
public Configuration()
{
CodeGenerator = new CodeMigrator();
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}
ただし、エラーは引き続き発生します。
dbo.Users_dbo.Departments_Department_Id' は制約ではありません。制約を削除できませんでした。以前のエラーを参照してください。
私は実際にすべてのメンバーをオーバーライドCSharpMigrationCodeGenerator
して、return ステートメントにブレークポイントを設定しようとしましたが、どれもヒットしませんでした。したがって、私のカスタムジェネレーターは決して使用されないようです。何が欠けているのかわかりません。