Миграция SubSonic 3 ActiveRecord игнорирует внешние ключи

Используя SubSonic 3 ActiveRecord, я сгенерировал код из существующей базы данных с внешними ключами. Чтобы обеспечить правильность схемы базы данных при переключении баз данных, я разместил код миграции в начале приложения, используя IDataProvider.MigrateToDatabase<MyClass>() для каждого класса, сгенерированного ActiveRecord.tt. Оказывается, код миграции не восстанавливает внешние ключи.

Как мне бороться с ФК:

  • Полностью забудьте о FK и обрабатывайте каскадные удаления в коде. Плюсы: в стиле Rails бизнес-логика хранится в коде. Минусы: необходимо обрабатывать транзакции, код становится намного уродливее; обход схемы между базой данных и ActiveRecord становится невозможным, если база данных переключена / очищена (необходимо всегда сохранять исходную схему для восстановления / изменения кода AR, иначе сгенерированные свойства типа «один ко многим» будут потеряны?); кроме того, мои коллеги могут подумать, что я сумасшедший.
  • Добавьте в миграции шаг для создания FK вручную. Плюсы: схема всегда актуальна; Код AR всегда можно будет восстановить. Минусы: зависимость от базы данных (небольшая проблема?)
  • Как-нибудь найти способ определить отношения FK в коде, чтобы схему можно было правильно перенести.

Я что делаю неправильно? Буду признателен за любой совет.


person glebd    schedule 11.09.2009    source источник


Ответы (1)


Я сейчас работаю над FK для классов и, хотите верьте, хотите нет - это довольно сложно. Если ваш родительский класс содержит список дочернего класса - много / много? Может быть - если ваш дочерний класс содержит обратную ссылку. Это слабое предположение (двунаправленность - не лучший дизайн).

Так или иначе.

AR предназначена больше для людей, предпочитающих БД, поэтому создайте свою БД по своему усмотрению, а затем запускайте шаблоны AR. Ваши FK будут отмечены и так далее.

person Community    schedule 11.09.2009
comment
Привет, Роб, я точно следую предложенному вами подходу, но по какой-то причине Subsonic не может выбрать первичный ключ. Вот ссылка на выпуск. stackoverflow.com/questions/1806953/ Пожалуйста, посоветуйте решение, поскольку оно стало для меня препятствием. Спасибо AJ - person AJ.; 30.11.2009
comment
Хммм, эта ссылка, кажется, не работает. Я не знаю, что вы имеете в виду под «не могу найти первичный ключ» - вы пробовали атрибут PrimaryKey? - person ; 03.12.2009