web-dev-qa-db-ja.com

外部キー制約の命名規則を変更する

オブジェクトの命名に関する独自の外部規則があり、自動生成された外部キー制約の命名規則を変更する必要があります。次のようになります:FK_dbo.City_dbo.CityType_City_CityTypeIdですが、City_FKC_CityType

制約の名前を手動で変更できることを示す 類似した質問 を見つけました。ただし、テーブルと外部キーの制約が多いため、これは私には適していません。

「Custom Code First Conventions」に関する情報を見つけましたが、これを使用して制約の名前を変更できるのか、それを実装する方法があるのでしょうか?

別の変種はEFのソースコードをダウンロードし、変更を加えて使用しますが、それは緊急の場合です。

補足として、主キーの命名規則も変更したいと思います。

12
Roman Marusyk

System.Data.Entity.SqlServer名前空間のSqlServerMigrationSqlGeneratorから派生したカスタムSQLジェネレータークラスを実装できます。

public class CustomSqlGenerator : SqlServerMigrationSqlGenerator
{
    protected override void Generate(AddForeignKeyOperation addForeignKeyOperation)
    {
        addForeignKeyOperation.Name = getFkName(addForeignKeyOperation.PrincipalTable,
            addForeignKeyOperation.DependentTable, addForeignKeyOperation.DependentColumns.ToArray());
        base.Generate(addForeignKeyOperation);
    }

    protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation)
    {
        dropForeignKeyOperation.Name = getFkName(dropForeignKeyOperation.PrincipalTable,
            dropForeignKeyOperation.DependentTable, dropForeignKeyOperation.DependentColumns.ToArray());
        base.Generate(dropForeignKeyOperation);
    }

    private static string getFkName(string primaryKeyTable, string foreignKeyTable, params string[] foreignTableFields)
    {
        // Return any format you need
    }
}

次に、DbContextを使用してDbConfigurationにジェネレーターを登録する必要があります。

public class CustomDbConfiguration : DbConfiguration
{
    public CustomDbConfiguration()
    {
        SetMigrationSqlGenerator(SqlProviderServices.ProviderInvariantName,
            () => new CustomSqlGenerator());
    }
}

DbConfigurationTypeAttribute

[DbConfigurationType(typeof(CustomDbConfiguration))]
public class YourEntities : DbContext

更新:主キー名を変更する場合は、次のGenerateメソッドをオーバーライドする必要があります。

protected override void Generate(CreateTableOperation createTableOperation) 
{
    createTableOperation.PrimaryKey.Name = getPkName(createTableOperation.Name);
    base.Generate(createTableOperation);
}

protected override void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation)
{
    addPrimaryKeyOperation.Name = getPkName(addPrimaryKeyOperation.Table);
    base.Generate(addPrimaryKeyOperation);
}

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