2015-07-21 145 views
12

我們有自己的命名對象的外部約定,我需要更改自動生成的外鍵約束的命名約定。現在看起來像:FK_dbo.City_dbo.CityType_City_CityTypeId但我希望它被稱爲City_FKC_CityType更改外鍵約束命名約定

我發現一個similar question其中說,你可以手動更改約束的名稱。但是,這不適合我,因爲我有很多表和外鍵約束。

我發現了一些關於「Custom Code First Conventions」的信息,我想知道是否可以使用它更改約束的名稱,或者是否有任何方法來實現它?

另一個變種是下載EF的源代碼,進行更改和使用,但在緊急情況下。

作爲一個方面說明,我還想更改主鍵的命名約定。

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

然後,你需要在DbContext註冊您的發電機使用DbConfiguration

+1

你豐富的使用粗體和斜體讓我的眼睛受傷了!另外,該答案中的解決方案不適合哪種方式?這很簡單。 – DavidG

+0

好吧,我改變了它:)。我有太多的表,每個表都有一些限制。更改每個外鍵的名稱需要很長時間 – Marusyk

回答

7

您可以從System.Data.Entity.SqlServer命名空間來實現從SqlServerMigrationSqlGenerator派生的自定義SQL生成器類

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

而且DbConfigurationTypeAttribute

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

UPDATE:如果你想改變一個主鍵的名稱,你需要重寫以下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); 
} 
+0

非常感謝。這是我需要的,你真的幫了我。再次感謝 – Marusyk

+0

小問題:我正在嘗試爲主鍵做到這一點,但出現了一些問題。我重寫了'void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation)'並實現。你能否建議我爲什麼創建PK時我的方法永遠不會運行? Thx – Marusyk

+1

將主鍵添加到現有實體時會觸發'AddPrimaryKeyOperation'生成。大部分時間都使用CreateTableOperation代。 –