Я создаю новое приложение, использующее NHibernate для создания схемы базы данных, но я вижу возможную проблему в будущем.
Очевидно, что вы используете все данные из своей базы данных, которые очищаются при обновлении схемы, но какие стратегии люди используют для восстановления каких-либо данных в новую базу данных. Я знаю, что массивные изменения в схеме усложнят эту задачу, но мне было интересно, как другие люди справились с этой проблемой.
Ваше здоровье Колин Джи
PS Я не буду делать это с живой базой данных, используя ее только для восстановления тестовых данных для интеграционного тестирования и непрерывной интеграции.
@Jane Я использую nhibernate SchemaExport для создания схемы базы данных и SchemaUpdate для добавления любых дополнительных столбцов в базу данных.


Мы не обновляем схему из 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}, .....}
@Andrew W: Если у вас есть дополнительный вопрос, вы должны опубликовать его как новый вопрос, а не как ответ на старый вопрос. Его будут читать больше людей, так как старые вопросы не так часто посещаются. Для этого в правом верхнем углу находится кнопка «Задать вопрос». Вы, конечно, всегда можете ссылаться на эту страницу для справки, если хотите.
Что вы используете для создания схемы?