Как изменить типы данных первичных и внешних ключей с помощью EF-миграции? - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужно изменить типы данных с int на bigint на всех первичных и внешних ключах, которые используются в уже существующей базе данных / таблицах.

Чтобы обойти следующую ошибку ...

Сообщение 5074, Уровень 16, Состояние 8, Строка 1
Объект 'Имя ограничения первичного ключа' зависит от столбца«Имя столбца первичного ключа».
Ошибка имени столбца ALTER TABLE ALTER COLUMN, так как один или несколько объектов обращаются к этому столбцу.

Сначала необходимо удалить ограничение, а затем создать его заново.,Вот как я это делаю, используя SSMS:

alter table Meta.Playground
drop constraint Pk_Playground
go

alter table Meta.Playground
alter column id bigint not null
go

alter table Meta.Playground
add constraint Pk_Playground primary key (id)
go

Но что будет лучшим способом сделать это, используя методы Up() и Down() Entity-Framework?

Я не знаюНе знаю, как я могу получить имена ключей и ограничений из этих методов.

Используя SQL, я бы получил их следующим образом:

select COLUMN_NAME, CONSTRAINT_NAME 
into #result
from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where TABLE_NAME = @table and TABLE_SCHEMA = @schema

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я понял, что способ, которым я пытаюсь решить эту проблему, является сложным.

Добавление дополнительного шага миграции решает мою проблему удивительным и простым способом.Так что нет необходимости в дополнительном скрипте SQL.Платформа Entity полностью поддерживает миграцию первичного и внешнего ключей (по крайней мере, версия 6.1.3, которую я использую).

Так выглядит код после вызова Add-Migration с соответствующими параметрами.

public override void Up()
{
    DropForeignKey(...)
    // ...
    DropIndex(...) 
    // ... 
    DropPrimaryKey(...)
    // ...
    AlterColumn(...)
    // ...
    AddPrimaryKey(...)
    // ...
    CreateIndex(...)
    // ...
    AddForeignKey) 
    // ...
}
0 голосов
/ 03 февраля 2019

Для работы с ограничениями в миграциях EF вам нужно будет напрямую выполнять операторы SQL.Вы можете сделать это с помощью функции Sql.

Например:

public override void Up()
{
    Sql("ALTER TABLE Meta.Playground DROP CONSTRAINT Pk_Playground");
}

Для поддержки динамического имени ограничения, которое вы хотите передать в операторе SQL, который получает имя изатем выполняет инструкцию ALTER.

Вот пример этого здесь: EF-миграция для изменения типа данных столбцов

 DECLARE @con nvarchar(128)
 SELECT @con = name
 FROM sys.default_constraints
 WHERE parent_object_id = object_id('dbo.Received')
 AND col_name(parent_object_id, parent_column_id) = 'FromNo';
 IF @con IS NOT NULL
     EXECUTE('ALTER TABLE [dbo].[Received] DROP CONSTRAINT ' + @con)

Это будет оператор, который вы передадитечерез функцию Sql.

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