更改外键约束命名约定

罗曼·马鲁西克(Roman Marusyk)

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

我发现了一个类似的问题,说您可以手动更改约束的名称。但是,这不适合我,因为我有很多表和外键约束。

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

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

另外,我还想更改主键的命名约定。

至少3且不超过30

您可以实现SqlServerMigrationSqlGeneratorSystem.Data.Entity.SqlServer名称空间派生的自定义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
    }
}

然后,你需要在注册您的发电机DbContext使用DbConfiguration

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章