2015-07-21 204 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代。 –