web-dev-qa-db-fra.com

Modifier la convention de dénomination des contraintes de clé étrangère

Nous avons notre propre convention externe de dénomination des objets et je dois changer la convention de dénomination pour les contraintes de clé étrangère générées automatiquement. Maintenant, cela ressemble à: FK_dbo.City_dbo.CityType_City_CityTypeId mais j'aimerais qu'il s'appelle City_FKC_CityType.

J'ai trouvé un question similaire qui dit que vous pouvez changer le nom des contraintes manuellement. Cependant, cela ne me convient pas, car j'ai beaucoup de tables et de contraintes de clés étrangères.

J'ai trouvé des informations sur les "Conventions du code personnalisé en premier" et je me demande si je peux changer le nom de la contrainte en utilisant ceci ou s'il existe des méthodes pour l'implémenter?

Une autre variante consiste à télécharger le code source d'EF, à y apporter des modifications et à l'utiliser, mais en cas d'urgence.

Comme note latérale, je voudrais également changer la convention de dénomination de la clé primaire.

12
Roman Marusyk

Vous pouvez implémenter une classe de générateur sql personnalisée dérivée de SqlServerMigrationSqlGenerator de System.Data.Entity.SqlServer espace de noms:

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
    }
}

Ensuite, vous devez enregistrer votre générateur dans DbContext en utilisant DbConfiguration:

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

Et DbConfigurationTypeAttribute:

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

MISE À JOUR: Si vous souhaitez modifier un nom de clé primaire, vous devez remplacer les méthodes Generate suivantes:

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);
}