2009-05-27 70 views
17

我为我的DAL使用NHibernate和FluentNHibernate。我也在使用SchemaExportSchemaUpdate来创建和更新我的数据库模式。是否有可能使用NHibernate创建数据库?

我的问题是架构操作都需要数据库存在才能工作。我想以编程方式创建我的数据库并更新架构,因为可能有多个数据库,并且创建数据库不仅是一次性操作。

我知道我可以通过在与master数据库的连接上执行create database命令来手动执行此操作,但是由于我以其他方式将NHibernate用于所有数据库交互,因此感觉错误。另外,我使用SQLite inmemory数据库进行单元测试,所以我写的任何sql都必须知道我正在使用哪个数据库。

有什么办法让NHibernate为我创建我的数据库?

回答

1

看看RhinoCommons。在Rhino.Commons.ForTesting下,在UnitOfWorkTestContextDbStrategy.cs,Ayende已经做了一些例程,创建数据库。

+0

谢谢,我打算使用它,它不是我想要的(NHibernate在做这件事),但它非常酷。我很惊讶地看到一个硬编码的“(本地)”数据库服务器参考:-) – Andrew 2009-05-27 11:02:56

1

嗯,你确实可以像你提到的那样使用SchemaExport,但我主要看到NHibernate是一种弥合OO域模型和关系持久性存储之间差距的方法。 也就是说,对我来说,NHibernate的目的是在我的领域模型中坚持和检索实体。

当你想做模式更新,恕我直言,你不应该使用NHibernate(如果可能的话),因为这不是NHibernate的目的;有一种称为SQL的“域特定语言”,它擅长做这些事情。

为了创建我的数据库并更新我的数据库模式,我使用了Migrator.NET,它是一个框架,它允许您在指定需要完成的地方编写C#类(创建表,添加列等等)。
这样做的好处是Migrator.NET也支持多个DBMS,所以你最终不会编写特定于DB的SQL代码。

+0

谢谢,我在看看Migrator.Net,看起来很酷,但它并没有解决我的实际创建数据库的问题。 – Andrew 2009-05-27 10:59:27

12

我认为使用NHibernate创建数据库很好,如果你开始开发与域模型的应用程序。我的意思是 - 它提供了一个洞察你的分贝应该看起来如何。但一般来说 - 应该使用sql脚本。

我听说有些开发人员使用NHibernate db generation进行集成测试,他们创建轻量级的sqlite db。

如何使用NHibernate生成数据库?这是我如何做到这一点:

public static void InitSessionFactory() 
    { 
     var connectionString = 
      ConfigurationManager 
       .ConnectionStrings["MyConnectionString"] 
       .ConnectionString; 

     var cfgFromXml = new Configuration(); 
     cfgFromXml.Configure(); 

     var cfg = Fluently.Configure(cfgFromXml) 
      .Database(MsSqlConfiguration.MsSql2005 
          .ConnectionString(x => x.Is(connectionString)) 
          .UseReflectionOptimizer()) 
      .Mappings(x => x.FluentMappings 
           .AddFromAssemblyOf<NHibernateBootstrapper>()) 
      .ExposeConfiguration(BuildSchema); 


     ObjectFactory.Inject(cfg.BuildSessionFactory()); 
    } 

    private static void BuildSchema(Configuration config) 
    { 
     //Creates database structure 
     //new SchemaExport(config) 
     // .Create(false, true); 
    } 
9

不,NHibernate不会为你创建数据库。创建数据库是你通常不希望在飞行中完成的事情。它需要很多配置参数,这是非常特定于数据库的,甚至是数据库特定的版本。

对于我们的产品,我写了一个设置数据库的类。它用于安装程序,集成测试和数据库维护工具。

  • NHibernate使用其配置创建连接。
  • 我自己的实现创建数据库。不同的方言有不同的实现。
  • NH创建表和其它数据库对象
  • 安装类创建初始数据

还有一个特殊的情况下,如果客户不希望授予创建数据库的权限。那么我们希望他这样做,并跳过这一部分。

+2

创建一个SqlCe数据库只需要一行代码:new SqlCeEngine(string.Format(“Data Source ='{0}';”,path )).CreateDatabase(); – HappyNomad 2009-10-03 05:03:13

+1

是的,使用默认配置创建一个sql server数据库并不复杂。但这不是重点。 NH并没有这样做,因为它很有意义。 – 2009-10-05 08:04:44

+0

这不完全是真的了。使用NH3,您可以使用hbm2ddl作为NHibernate.Tool命名空间的一部分 – Dann 2011-09-01 11:32:35

5

我们使用SchemaExport来提供架构和Nant任务来删除和重新创建数据库。另一个Nant任务运行模式导出和数据加载代码,该代码以由nunit任务运行的集成测试的形式存在。有一个sample here

相关问题