Ошибки NHibernate при работе с бюрократией DBA
У нас есть проблемы со слишком большим количеством волокиты при работе с изменениями в базе данных. Возможно, самое странное, что эта красная лента применяется к инструментам тестирования, разработанным собственными силами, которые используют схему базы данных, которая никогда не используется. Мы можем применить изменения к нашей основной среде тестирования в течение нескольких дней, но я могу потратить несколько недель, чтобы применить их к другим средам тестирования. Это разрушает наше использование NHibernate, потому что, если обновленное отображение применяется к более старым базам данных, вещи перестают работать полностью. Мы не удаляем столбцы, а только добавляем больше, когда это уместно. Из-за случайных ошибок или общих улучшений мы постоянно обновляем все версии наших инструментов тестирования.
Есть ли способ заставить NHibernate изящно игнорировать сопоставленный столбец, если он не существует в базе данных (возможно, установив значения по умолчанию для объектов)?
Мы используем файлы hbm.xml прямо сейчас.
1 ответ
Я думаю, что это больше проблема контроля версий, чем что-либо еще. Обычно базы данных и версии программного обеспечения должны идти рука об руку. С хорошей стратегией ветвления и слияния вы не столкнетесь с этим. У вас всегда должна быть версия вашего источника, которая связана с тем, что на самом деле находится в производстве (по моему мнению).
В нашей ситуации, когда версия программного обеспечения / базы данных выпущена, у нас есть ветвь выпуска, которая соответствует этой версии. Если необходимо внести изменения в программное обеспечение, например, при добавлении столбца базы данных, у нас будет ветвь разработки, где работа была выполнена, и когда она будет готова к выпуску в производстве, мы создадим новую ветку выпуска, которая соответствует тому, что вы просто установлен в производство.
Если необходимо исправить ошибки в рабочей версии, вы можете перейти из ветки релиза, чтобы исправить ошибку. После тестирования и развертывания в рабочей среде вы должны объединить изменения, внесенные в ветку исправления ошибок, с веткой выпуска, чтобы снова представить, что было в рабочей среде. Затем вы также, в свою очередь, объедините любые изменения из этой ветки релиза с вашей "последней"/ основной веткой.
Здесь есть несколько отличных руководств по различным стратегиям ветвления и слияния: http://vsarbranchingguide.codeplex.com/releases
Но, чтобы ответить на ваш конкретный вопрос, я не думаю, что есть отличный способ сделать это. Если он находится в отображении, nhibernate запросит его, что приведет к ошибкам.
Редактировать:
Есть вещи, которые вы можете сделать в NHibernate, чтобы смотреть только на определенные столбцы. Например, для обновлений и вставок вы можете настроить сопоставления для динамических вставок и обновлений:
(7) dynamic-update (необязательно, по умолчанию false): указывает, что SQL UPDATE должен генерироваться во время выполнения и содержать только те столбцы, значения которых изменились.
(8) dynamic-insert (необязательно, по умолчанию false): указывает, что INSERT SQL должен генерироваться во время выполнения и содержать только столбцы, значения которых не равны NULL.
Выше взято из: http://nhibernate.info/doc/nh/en/
Также в запросах nhibernate вы можете указать конкретные столбцы, которые вы хотите запросить:
IList selection =
session.QueryOver<Cat>()
.Select(
c => c.Name,
c => c.Age)
.List<object[]>();