是否可以使用NHibernate创建数据库?

时间:2009-05-27 07:15:43

标签: database nhibernate fluent-nhibernate

我正在使用带有FluentNHibernate的NHibernate作为我的DAL。我还使用SchemaExportSchemaUpdate来创建和更新我的数据库架构。

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

我知道我可以通过在与master数据库的连接上执行create database命令来手动执行此操作,但考虑到我否则使用NHibernate进行所有数据库交互,这感觉不对。顺便说一句,我使用SQLite内存数据库进行单元测试,因此我编写的任何sql都必须知道我正在使用哪个数据库。

有没有办法让NHibernate为我创建数据库?

6 个答案:

答案 0 :(得分:12)

如果您开始使用域模型开发应用程序,我认为使用NHibernate创建数据库很不错。我的意思是 - 它可以让您深入了解数据库的外观。但一般来说 - 应该使用sql脚本。

我听说有些开发人员使用NHibernate数据库生成进行集成测试,他们在飞行中创建轻量级的sqlite数据库。

如何使用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);
    }

答案 1 :(得分:9)

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

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

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

还有一种特殊情况,即客户不希望授予创建数据库的权利。然后我们希望他这样做并跳过这部分。

答案 2 :(得分:5)

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

答案 3 :(得分:1)

嗯,你确实可以使用SchemaExport,但我认为NHibernate主要是为了弥合OO域模型和关系持久性存储之间的差距。 也就是说,对我来说,NHibernate的目的是在我的域模型中持久化和检索实体。

如果你想进行架构更新,imho,你不应该使用NHibernate(如果可能的话),因为那不是NHibernate的目的;有一种称为SQL的“域特定语言”,它擅长做这些事情。

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

答案 4 :(得分:1)

看看RhinoCommons。在Rhino.Commons.ForTesting下,在UnitOfWorkTestContextDbStrategy.cs中,Ayende在那里创建了一些创建数据库的例程。

答案 5 :(得分:0)

我自己正在寻找这个,就像我在java中看到的那样 - 这里有类似的问题:Generate Database from NHibernate config files