2015-07-21 25 views
12

Wir haben unsere eigene externe Konvention zum Benennen von Objekten, und ich muss die Namenskonvention für die automatisch generierten Fremdschlüsseleinschränkungen ändern. Jetzt sieht es so aus: FK_dbo.City_dbo.CityType_City_CityTypeId aber ich möchte es City_FKC_CityType genannt werden.Namenskonvention für Fremdschlüsseleinschränkung ändern

Ich fand eine similar question, die besagt, dass Sie den Namen der Einschränkungen manuell ändern können. Dies passt mir jedoch nicht, da ich viele Tabellen und Fremdschlüssel-Einschränkungen habe.

Ich habe einige Informationen über "Custom Code First Conventions" gefunden und frage mich, ob ich den Namen der Constraint mit diesem ändern kann oder ob es Methoden gibt, es zu implementieren?

Eine andere Variante ist den Quellcode von EF herunterladen, Änderungen vornehmen und verwenden, aber das ist im Notfall.

Als Randnotiz möchte ich auch die Namenskonvention des Primärschlüssels ändern.

+1

Ihre reichliche Verwendung von fett und kursiv macht meine Augen weh! Auch, in welcher Weise passt die Lösung in dieser Antwort nicht? Es ist ziemlich einfach. – DavidG

+0

Ok, ich habe es geändert :). Ich habe zu viele Tabellen und jede Tabelle hat ein paar Einschränkungen. Es wird lange dauern, einen Namen für jeden Fremdschlüssel zu ändern – Marusyk

Antwort

7

Sie können eine benutzerdefinierte SQL-Generator Klasse von SqlServerMigrationSqlGenerator aus System.Data.Entity.SqlServer Namensraum abgeleitet implementieren:

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

Dann müssen Sie Ihren Generator in DbContext registrieren DbConfiguration mit:

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

Und DbConfigurationTypeAttribute:

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

UPDATE: Wenn Sie einen Primärschlüssel Namen ändern wollen, müssen Sie folgende Generate Methoden außer Kraft zu setzen:

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

Vielen Dank. Das ist was ich brauche, du hast mir wirklich geholfen. Danke nochmal – Marusyk

+0

Und kleine Frage: Ich versuche das auch für den Primärschlüssel zu tun, aber etwas stimmt nicht. Ich überschrieb die 'void Generate (AddPrimaryKeyOperation addPrimaryKeyOperation)' und implementiert. Könntest du mir bitte vorschlagen, warum meine Methode niemals beim Erstellen von PK läuft? Thx – Marusyk

+1

Die 'AddPrimaryKeyOperation'-Generierung wird ausgelöst, wenn Sie der vorhandenen Entität einen Primärschlüssel hinzufügen. Die meiste Zeit wird die 'CreateTableOperation'-Generation verwendet. –