2015-07-21 14 views
12

Abbiamo la nostra convenzione esterna degli oggetti di denominazione e ho bisogno di modificare la convenzione di denominazione per i vincoli di chiave esterna generata automaticamente. Ora sembra: FK_dbo.City_dbo.CityType_City_CityTypeId ma mi piacerebbe chiamarlo City_FKC_CityType.Modifica convenzione di denominazione dei vincoli di chiave esterna

Ho trovato un similar question che dice che è possibile modificare manualmente il nome dei vincoli. Tuttavia, questo non mi va bene, dal momento che ho un sacco di tabelle e vincoli di chiave esterna.

Ho trovato alcune informazioni su "Prime convenzioni del codice personalizzato" e mi chiedo se posso cambiare il nome del vincolo usando questo o se ci sono dei metodi per implementarlo?

Un'altra variante è scaricare il codice sorgente di EF, apportare modifiche e utilizzarlo ma in caso di emergenza.

Come nota a margine, vorrei anche modificare la convenzione di denominazione della chiave primaria.

+1

L'utilizzo abbondante di grassetto e corsivo rende i miei occhi male! Inoltre, in che modo la soluzione in quella risposta non è adatta? È piuttosto semplice – DavidG

+0

Ok, l'ho cambiato :). Ho troppe tabelle e ogni tabella ha qualche vincolo. Ci vorrà molto tempo per cambiare un nome per ogni chiave esterna – Marusyk

risposta

7

È possibile implementare una classe generatore di SQL personalizzata derivata dai SqlServerMigrationSqlGenerator da System.Data.Entity.SqlServer namespace:

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

allora avete bisogno di registrare il generatore in DbContext utilizzando DbConfiguration:

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

E DbConfigurationTypeAttribute:

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

UPDATE: Se si desidera cambiare il nome della chiave primaria, è necessario eseguire l'override seguente Generate metodi:

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

Grazie mille. Questo è quello di cui ho bisogno, mi hai davvero aiutato. Grazie ancora – Marusyk

+0

E una piccola domanda: sto provando a farlo anche per la chiave primaria, ma qualcosa di sbagliato. Ho eseguito l'override di 'void Generate (AddPrimaryKeyOperation addPrimaryKeyOperation)' e implementato. Potresti per favore suggerirmi perché il mio metodo non funziona mai durante la creazione di PK? Thx – Marusyk

+1

La generazione 'AddPrimaryKeyOperation' viene attivata quando si aggiunge una chiave primaria all'entità esistente. La maggior parte delle volte viene utilizzata la generazione di 'CreateTableOperation'. –

Problemi correlati