使用NHibernate生成模式的策略

时间:2008-11-25 21:36:28

标签: sql nhibernate

我正在构建一个使用NHibernate生成数据库架构的新应用程序,但我可以看到将来可能存在的问题。

显然,当您更新架构时,您使用数据库中的所有数据都会被清除,但人们使用什么样的数据来将任何数据恢复到新数据库。我知道模式的大规模更改会使这很难,但是想知道其他人是如何处理这个问题的。

干杯 科林G

PS我不会对实时数据库执行此操作,仅使用它来恢复测试数据以进行集成测试和持续集成

5 个答案:

答案 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和一些手动编辑。