我正在构建一个使用NHibernate生成数据库架构的新应用程序,但我可以看到将来可能存在的问题。
显然,当您更新架构时,您使用数据库中的所有数据都会被清除,但人们使用什么样的数据来将任何数据恢复到新数据库。我知道模式的大规模更改会使这很难,但是想知道其他人是如何处理这个问题的。
干杯 科林G
PS我不会对实时数据库执行此操作,仅使用它来恢复测试数据以进行集成测试和持续集成
答案 0 :(得分:5)
测试时,我们使用NHibernate创建数据库,然后使用一系列builders来为每个测试夹具创建数据。我们还使用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构建了一套全面的数据,并且通常会将其中的一些数据重构为工厂,这些工厂将包含上述内容,并且可以轻松获取虚拟数据。
答案 1 :(得分:1)
我认为在很多情况下让NHibernate为你生成架构是一件好事。要重新创建测试数据,您可以使用由测试框架(例如NUnit)驱动的代码,也可以将测试数据导出为SQL脚本,您可以在更新架构后运行该脚本。
答案 2 :(得分:1)
快速提问@Chris运河 -
我知道使用流畅的界面来构建对象使其看起来可读,但是当您可以使用C#3.0语法时,编写这些“构建器”所需的额外工作真的值得吗?
即。举个例子:
var customer = new CustomerBuilder()。WithFirstName(“John”)。WithLastName(“Doe”)。Build();
这真的值得构建一个“构建器”,而你可以这样做(这可以说是可读的,实际上是更少的代码)?:
var customer = new Customer {FirstName =“John”,LastName =“Doe”};
答案 3 :(得分:0)
我们不会从NHibernate更新架构。我们使用SQLCompare跨环境移动数据库模式。 SQLCompare非破坏性地做到这一点。
如果您已经在使用NHibernate,我建议您使用代码创建测试数据。
答案 4 :(得分:0)
我们在公司也这样做。我们使用NHibernate为我们的开发和测试目的生成数据库。对于测试,我们使用SQLite作为后端,只需为每个测试测试套件单独生成测试数据。
更新我们的临时/生产服务器时,如果更改更复杂,我们会使用SQLCompare和一些手动编辑。