Entity Framework 6 Пользовательская DBConfiguration PK Генератор имен ограничений - PullRequest
1 голос
/ 05 февраля 2020

Используя MVC и Entity Framework 6 с миграциями кода, EF из коробки генерирует имена ограничений PK как dbo_TableName. Я хочу иметь возможность переименовать их в «pkTableColColumn». Мне известно, что EF Core поддерживает это .HasConstraintName("MyFKConstraint");

К сожалению, я не думаю, что EF 6 поддерживает это с помощью 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;

    }
}

Это отлично работало при добавлении новой таблицы с PK или даже составным PK (что приведет к в pkTableColColumnAndColumn. Единственная проблема, с которой я столкнулся, заключалась в том, чтобы изменить первичный ключ и вызвать его protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation) Обе другие функции переопределения для createTableOperation и addPrimaryKeyOperation заполнены соответствующими объектами Columns. Однако dropPrimaryKeyOperation не имеет объекта столбцов .

Я немного новичок в этом API и буду признателен за любые идеи о том, как получить функцию dropPrimaryKey, чтобы получить текущие столбцы, которые являются PK.

Как только я получу все это отсортировано Я планирую использовать аналогичный процесс для переименования ограничений FK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...