实体框架6自定义DBConfiguration PK约束名称生成器

时间:2020-02-05 16:38:46

标签: c# sql-server entity-framework entity-framework-6 ef-code-first

将MVC和Entity Framework 6与Code First Migrations一起使用时,开箱即用的EF生成PK约束名称为dbo_TableName。我希望能够将其重命名为“ pkTableColColumn”,我知道EF Core支持此.HasConstraintName("MyFKConstraint");

不幸的是,我不认为EF 6通过fluentAPI或数据注释支持此功能。

我以this amazing post为起点。主要区别在于他们希望其PK约束名称为“ PKTable”,在这里我希望将其命名为“ pk [Table] Col [ColumnName]”。

对PKNameGenerator类进行一些更改后,我的结果如下:

public class PKNameGenerator : SqlServerMigrationSqlGenerator
{
    static readonly string PREFIX = "pk"; // prefix with pk

    // this one works as the Columns property exists in this context
    protected override void Generate(CreateTableOperation createTableOperation)
    {
        createTableOperation.PrimaryKey.Name = GetPkName(createTableOperation.Name, createTableOperation.PrimaryKey.Columns);
        base.Generate(createTableOperation);
    }

    // this one works as the Columns property exists in this context
    protected override void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation)
    {
        addPrimaryKeyOperation.Name = GetPkName(addPrimaryKeyOperation.Table, addPrimaryKeyOperation.Columns);
        base.Generate(addPrimaryKeyOperation);
    }

    // this one does not work as the Columns property does not exist in this context
    protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation)
    {
        dropPrimaryKeyOperation.Name = GetPkName(dropPrimaryKeyOperation.Table, dropPrimaryKeyOperation.Columns);
        base.Generate(dropPrimaryKeyOperation);
    }

    // Prefix + TableName + "Col" + ColumnName + And + ColumnName (and only applies with composite PKs)
    string GetPkName(string tableName, IList<string> columns)
    {
        string columnNaming = "";
        if (columns.Count > 1)
        {
            columnNaming = string.Join("And", columns.Select(c => c).ToArray());
        }
        else
        {
            columnNaming = columns[0];
        }

        return PREFIX + tableName.Substring(tableName.IndexOf('.') + 1) + "Col" + columnNaming;

    }
}

这在添加带有PK或什至是复合PK的新表(这将导致pkTableColColumnAndColumn)时非常有效。我唯一遇到的问题是当我更改主键并同时调用protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation)

其他的createTableOperation和addPrimaryKeyOperation覆盖函数都填充了适当的Columns对象,但是dropPrimaryKeyOperation没有columns对象。

我对这个API有点陌生,并且希望获得有关如何获取dropPrimaryKey函数为我提供PK的当前列的任何想法。

一旦解决了所有这些问题,我计划使用类似的过程来重命名FK约束。

0 个答案:

没有答案