#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';