13

以前は 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 ステートメントにブレークポイントを設定しようとしましたが、どれもヒットしませんでした。したがって、私のカスタムジェネレーターは決して使用されないようです。何が欠けているのかわかりません。

4

1 に答える 1

6

私は答えを見つけました。それは、質問でリンクした質問の答えに似ています。問題のオーバーライドは、カスタム マイグレーションCSharpCodeGeneratorでのみ使用されます。

自動移行をオーバーライドするには、SqlServerMigrationSqlGeneratorクラスをオーバーライドSetSqlGenerator()して Migration.Configuration コンストラクターを呼び出す必要があります。

public class SqlMigrator : SqlServerMigrationSqlGenerator
{
    protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation)
    {
        dropForeignKeyOperation.Name = StripDbo(dropForeignKeyOperation.Name);
        base.Generate(dropForeignKeyOperation);
    }

    protected override void Generate(DropIndexOperation dropIndexOperation)
    {
        dropIndexOperation.Name = StripDbo(dropIndexOperation.Name);
        base.Generate(dropIndexOperation);
    }

    protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation)
    {
        dropPrimaryKeyOperation.Name = StripDbo(dropPrimaryKeyOperation.Name);
        base.Generate(dropPrimaryKeyOperation);
    }

    private string StripDbo(string name)
    {
        return name.Replace("dbo.", "");
    }
}

そして移行設定:

public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false;
        SetSqlGenerator("System.Data.SqlClient", new SqlMigrator());
    }
于 2013-06-24T19:47:56.690 に答える