Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6自定义DBConfiguration PK约束名称生成器_C#_Sql Server_Entity Framework_Entity Framework 6_Ef Code First - Fatal编程技术网

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

C# 实体框架6自定义DBConfiguration PK约束名称生成器,c#,sql-server,entity-framework,entity-framework-6,ef-code-first,C#,Sql Server,Entity Framework,Entity Framework 6,Ef Code First,使用MVC和实体框架6以及代码优先迁移,EF开箱即用生成PK约束名称作为dbo_TableName。我希望能够将它们重命名为“pkTableColColColumn”,我知道EF Core支持这个。HasConstraintName(“MyFKConstraint”) 不幸的是,我不认为EF6通过fluentAPI或数据注释支持这一点 我把它作为一个起点。主要区别在于,他们希望自己的PK约束名称为“PKTable”,我希望我的名称为“PK[Table]Col[ColumnName]” 对PKNa

使用MVC和实体框架6以及代码优先迁移,EF开箱即用生成PK约束名称作为dbo_TableName。我希望能够将它们重命名为“pkTableColColColumn”,我知道EF Core支持这个
。HasConstraintName(“MyFKConstraint”)

不幸的是,我不认为EF6通过fluentAPI或数据注释支持这一点

我把它作为一个起点。主要区别在于,他们希望自己的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;

    }
}
公共类PKNameGenerator:SqlServerMigrationSqlGenerator { 静态只读字符串PREFIX=“pk”//带有pk的前缀 //这是因为Columns属性在此上下文中存在 受保护的覆盖无效生成(CreateTableOperation CreateTableOperation) { createTableOperation.PrimaryKey.Name=GetPkName(createTableOperation.Name,createTableOperation.PrimaryKey.Columns); 生成(createTableOperation); } //这是因为Columns属性在此上下文中存在 受保护的覆盖无效生成(AddPrimaryKeyOperation AddPrimaryKeyOperation) { addPrimaryKeyOperation.Name=GetPkName(addPrimaryKeyOperation.Table,addPrimaryKeyOperation.Columns); 生成(addPrimaryKeyOperation); } //此选项不起作用,因为此上下文中不存在Columns属性 受保护的覆盖无效生成(DropPrimaryKeyOperation DropPrimaryKeyOperation) { dropPrimaryKeyOperation.Name=GetPkName(dropPrimaryKeyOperation.Table,dropPrimaryKeyOperation.Columns); 生成(dropPrimaryKeyOperation); } //前缀+TableName+“Col”+ColumnName+和+ColumnName(仅适用于复合PKs) 字符串GetPkName(字符串表名,IList列) { 字符串columnName=“”; 如果(columns.Count>1) { columnname=string.Join(“And”,columns.Select(c=>c.ToArray()); } 其他的 { ColumnName=列[0]; } 返回前缀+tableName.Substring(tableName.IndexOf('.')+1)+“Col”+columnname; } }
当添加具有PK甚至复合PK的新表时(这将导致PKTableColumnAndColumn)。我遇到的唯一问题是当我更改主键时,它将调用
受保护的重写void Generate(DropPrimaryKeyOperation DropPrimaryKeyOperation)
createTableOperation和addPrimaryKeyOperation的其他重写函数都填充了相应的Columns对象。但是,dropPrimaryKeyOperation没有Columns对象

我对这个API有点陌生,如果您能告诉我如何让dropPrimaryKey函数为我提供当前的PK列,我将不胜感激

一旦我把这些都整理好,我计划使用类似的过程来重命名FK约束