2015-07-21 12 views
12

Kendi harici adlandırma nesnelerimiz var ve otomatik oluşturulan yabancı anahtar kısıtlamaları için adlandırma kuralını değiştirmem gerekiyor. Şimdi gibi görünüyor: FK_dbo.City_dbo.CityType_City_CityTypeId ama ben City_FKC_CityType çağrılmak istiyorum.Yabancı anahtar kısıtlama adlandırma kuralını değiştirin

similar question numaralı bağlantı noktasını buldum, bu da kısıtlamaların adını el ile değiştirebileceğinizi söylüyor. Ancak, bu bana pek de uygun değil, çünkü çok fazla masa ve yabancı anahtar kısıtlarım var.

"Custom Code First Conventions" hakkında bazı bilgiler buldum ve bunu kullanarak kısıtlama adını değiştirip değiştiremeyeceğimi veya uygulamak için herhangi bir yöntem olup olmadığını merak ediyorum?

Başka bir değişken EF'nin kaynak kodunu indirir, değişiklik yapar ve bunu kullanır, ancak acil durumlarda kullanılır.

Bir yan not olarak, birincil anahtarın adlandırma kuralını da değiştirmek isterim. DbConfiguration kullanarak

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

Sonra DbContext da jeneratör kaydetmeniz gerekir:

+1

koyu ve italik Sizin bol kullanılması gözlerim zarar yapar! Ayrıca, bu cevaptaki çözüm hangi yönde uymuyor? Oldukça basit. – DavidG

+0

Tamam, değiştirdim :). Çok fazla masa var ve her tablonun bir kaç kısıtlaması var. Her yabancı anahtar için bir isim değiştirmek uzun zaman alacaktır – Marusyk

cevap

7

Sen System.Data.Entity.SqlServer ad alanından SqlServerMigrationSqlGenerator türetilen özel bir sql jeneratör sınıfını uygulayabilir

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

Ve DbConfigurationTypeAttribute:

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

GÜNCELLEME: Birincil anahtar adını değiştirmek isterseniz, Generate yöntemlerle aşağıdaki geçersiz kılmak gerekir:

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

Çok teşekkür ederim. İhtiyacım olan bu, gerçekten bana yardım ettin. Tekrar teşekkürler – Marusyk

+0

Ve küçük soru: Bunu birincil anahtar için de yapmaya çalışıyorum, ama yanlış bir şey. Ben geçersiz Generate (AddPrimaryKeyOperation addPrimaryKeyOperation) 'geçersiz kıldı ve uyguladı. Lütfen bana, PK'yi oluştururken yöntemimin neden hiç çalışmadığını önerebilir misiniz? Var olan öğeye birincil anahtar eklediğinizde Thx – Marusyk

+1

'AddPrimaryKeyOperation' nesli başlatılır. Çoğu zaman CreateTableOperation' nesli kullanılır. –