Переход на общий первичный ключ в существующей БД?

#c# #.net #entity-framework #migration #ef-code-first

#c# #.net #entity-framework #миграция #ef-code-first

Вопрос:

У меня есть существующая структура таблицы, которая выглядит примерно так:

 AnimalTable
-------------
|Id         |
|Color      |
|Weight     |
|AnimalType |
-------------

CatTable
----------------
|Id            |
|MeowSound     |
|AnimalTableId |
----------------

DogTable
----------------
|Id            |
|BarkSound     |
|AnimalTableId |
----------------
 

AnimalType это либо «Кошка», либо «Собака». По сути, это структура «Таблица для каждого типа» плюс дополнительный дискриминатор «AnimalType» в AnimalTable. Очевидно, что это надуманный пример, но мой проект имеет аналогичную настройку, которая использовалась в течение длительного времени. Мы начинаем преобразовывать некоторые вещи, чтобы использовать подход EF Code First, и я хотел бы использовать эту же схему, чтобы у меня был абстрактный Animal класс, а также конкретные Cat классы и Dog классы.

Настройка этого с нуля кажется довольно простой, но я не уверен, как лучше всего изменить первичные ключи в моих существующих таблицах, чтобы сделать это так, как если бы я все время использовал EF. Кто-нибудь делал это и может дать несколько советов / указаний? Заранее спасибо.

Ответ №1:

В итоге я написал хранимую процедуру, которая по существу удалила Id столбец в CatTable и DogTable , переименовала AnimalTableId в Id , и сделала это первичным ключом. Звучит достаточно просто, но сложной частью было написать что-то, что в общем случае исправило бы все внешние ключи, уже указанные на CatTable.Id и DogTable.Id .

Ответ №2:

Сценарии обновления.

В будущем вы столкнетесь с тем же решением при других изменениях схемы. В своей разработке вы можете реорганизовать классы и позволить EF генерировать базу данных для вас. Когда вы переходите к производству, вам также необходимо создать скрипт, который обновляет производство.

Чтобы изменить первичные ключи, используйте:

 EXEC sp_rename 'CatTable.Id', 'AnimalTableId', 'COLUMN';