【问题标题】:Change foreign key constraint naming convention更改外键约束命名约定
【发布时间】:2015-07-21 09:14:51
【问题描述】:

我们有自己的命名对象的外部约定,我需要更改自动生成的外键约束的命名约定。现在它看起来像:FK_dbo.City_dbo.CityType_City_CityTypeId,但我希望它被称为City_FKC_CityType

我找到了similar question,它说您可以手动更改约束的名称。但是,这不适合我,因为我有很多表和外键约束。

我找到了一些关于“自定义代码优先约定”的信息,我想知道是否可以使用它来更改约束的名称,或者是否有任何方法可以实现它?

另一个变体是下载 EF 的源代码,进行更改并使用它,但这是在紧急情况下。

顺便说一句,我还想更改主键的命名约定。

【问题讨论】:

  • 你大量使用粗体和斜体让我的眼睛受伤了!另外,该答案中的解决方案以什么方式不适合?这很简单。
  • 好的,我改了:)。我有太多的表,每个表都有一些约束。为每个外键改名需要很长时间

标签: c# entity-framework naming-conventions code-first


【解决方案1】:

你可以从System.Data.Entity.SqlServer命名空间实现一个自定义的从SqlServerMigrationSqlGenerator派生的sql生成器类:

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

然后你需要使用DbConfigurationDbContext注册你的生成器:

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

还有DbConfigurationTypeAttribute:

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

更新:如果要更改主键名称,则需要覆盖以下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);
}

【讨论】:

  • 非常感谢。这就是我需要的,你真的帮助了我。再次感谢
  • 还有一个小问题:我也在尝试对主键执行此操作,但出了点问题。我覆盖了void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation) 并实现了。您能否建议我为什么我的方法在创建 PK 时从未运行?谢谢
  • AddPrimaryKeyOperation generation 在您向现有实体添加主键时触发。大多数时候使用CreateTableOperation代。
  • 您对为什么这对我不起作用有任何理论吗?我正在使用 MSSQL 提供程序,并且已按照建议将所有内容都连接起来,但快速的日志记录语句显示 GetFkName() 从未被命中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2017-11-24
  • 2014-02-06
  • 1970-01-01
相关资源
最近更新 更多