Стратегии использования NHibernate для создания схемы

Я создаю новое приложение, использующее NHibernate для создания схемы базы данных, но я вижу возможную проблему в будущем.

Очевидно, что вы используете все данные из своей базы данных, которые очищаются при обновлении схемы, но какие стратегии люди используют для восстановления каких-либо данных в новую базу данных. Я знаю, что массивные изменения в схеме усложнят эту задачу, но мне было интересно, как другие люди справились с этой проблемой.

Ваше здоровье Колин Джи

PS Я не буду делать это с живой базой данных, используя ее только для восстановления тестовых данных для интеграционного тестирования и непрерывной интеграции.

Что вы используете для создания схемы?

Quintin Par 19.08.2009 15:49

@Jane Я использую nhibernate SchemaExport для создания схемы базы данных и SchemaUpdate для добавления любых дополнительных столбцов в базу данных.

pythonandchips 24.08.2009 13:20
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
2
3 472
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Мы не обновляем схему из NHibernate. Мы используем SQLCompare для перемещения схем баз данных между средами. SQLCompare делает это неразрушающим образом.

Если вы уже используете NHibernate, я бы рекомендовал создавать тестовые данные с помощью кода.

Я думаю, что во многих ситуациях полезно позволить NHibernate сгенерировать схему за вас. Чтобы воссоздать тестовые данные, вы либо используете код, управляемый платформой тестирования (например, NUnit), либо можете экспортировать тестовые данные в виде сценария SQL, который вы можете запустить после обновления схемы.

Ответ принят как подходящий

При тестировании мы используем NHibernate для создания базы данных, а затем серию строители для создания данных для каждого тестового прибора. Мы также используем Sqlite для этих тестов, поэтому они быстро проходят.

Наши строители выглядят примерно так:

public class CustomerBuilder : Builder<Customer>
{
   string firstName;
   string lastName;
   Guid id = Guid.Empty;

   public override Customer Build()
   {
      return new Customer() { Id = id, FirstName = firstName, LastName = }
   }

   public CustomerBuilder WithId(Guid newId)
   {
      id= newId;
      return this;
   }

   public CustomerBuilder WithFirstName(string newFirstName)
   {
      firstName = newFirstName;
      return this;
   }

   public CustomerBuilder WithLastName(string newLastName)
   {
      lastName = newLastName;
      return this;
   }
}

и использование:

var customer = new CustomerBuilder().WithFirstName("John").WithLastName("Doe").Build();

Поскольку каждая строка кода написана с использованием TDD, мы создаем исчерпывающий набор данных из scatch и, как правило, реорганизуем некоторые из них на фабрики, которые обернут вышеупомянутое и упростят получение фиктивных данных.

Аналогичным образом мы поступаем и в нашей компании. Мы используем NHibernate для создания базы данных для целей разработки и тестирования. Для тестирования мы используем SQLite в качестве серверной части и просто генерируем тестовые данные отдельно для каждого набора тестов.

При обновлении наших промежуточных / производственных серверов мы используем SQLCompare и некоторое ручное редактирование, если изменения более сложные.

Просто быстрый вопрос, направленный @Chris Canal-

Я понимаю, что использование свободного интерфейса для построения ваших объектов делает их удобочитаемыми, но действительно ли стоит дополнительных усилий, необходимых для написания этих «построителей», когда вы можете использовать синтаксис C# 3.0?

т.е. возьмите свой пример:

var customer = new CustomerBuilder (). WithFirstName («Джон»). WithLastName («Doe»). Build ();

действительно ли это стоит усилий по созданию "строителя", когда вместо этого вы можете это сделать (что, возможно, так же читабельно и, по сути, меньше кода) ?:

var customer = new Customer {FirstName = "John", LastName = "Doe"};

Простой случай, который использует @chriscanal, вероятно, плохо показывает использование построителей. Например, вы можете сказать new CustomerBuilder (). WithNumberOfItems (10), где WithNumberOfItems может сгенерировать 10 случайных элементов для вашего теста и установить некоторые значения по умолчанию в элементах для вашего теста. Это может уменьшить код и повысить удобочитаемость чего-то вроде этого var customer = new Customer {Items = new List <Item> {new Item () {SomeThing = "", Price = 10}, .....}

pythonandchips 07.08.2009 19:27

@Andrew W: Если у вас есть дополнительный вопрос, вы должны опубликовать его как новый вопрос, а не как ответ на старый вопрос. Его будут читать больше людей, так как старые вопросы не так часто посещаются. Для этого в правом верхнем углу находится кнопка «Задать вопрос». Вы, конечно, всегда можете ссылаться на эту страницу для справки, если хотите.

sth 25.08.2009 20:01

Другие вопросы по теме