Tenemos nuestra propia convención externa de nomenclatura de objetos y necesito cambiar la convención de nomenclatura para las restricciones de clave externa generadas automáticamente. Ahora parece: FK_dbo.City_dbo.CityType_City_CityTypeId pero me gustaría que se llamara City_FKC_CityType .
Encontré una pregunta similar que dice que puede cambiar el nombre de las restricciones manualmente. Sin embargo, esto no me conviene, ya que tengo muchas tablas y restricciones de clave externa.
Encontré información sobre "Primeras convenciones de código personalizado" y me pregunto si puedo cambiar el nombre de la restricción usando esto o si hay algún método para implementarlo.
Otra variante es descargar el código fuente de EF, hacer cambios y usarlo pero eso es en caso de emergencia.
Como nota al margen, también me gustaría cambiar la convención de nomenclatura de la clave principal.
Puede implementar una clase generadora de sql personalizada derivada de SqlServerMigrationSqlGenerator del espacio de nombres System.Data.Entity.SqlServer :
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 } } Luego, debe registrar su generador en DbContext usando DbConfiguration :
public class CustomDbConfiguration : DbConfiguration { public CustomDbConfiguration() { SetMigrationSqlGenerator(SqlProviderServices.ProviderInvariantName, () => new CustomSqlGenerator()); } } Y DbConfigurationTypeAttribute :
[DbConfigurationType(typeof(CustomDbConfiguration))] public class YourEntities : DbContext ACTUALIZACIÓN: si desea cambiar el nombre de una clave principal, debe anular los siguientes métodos de 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); }