【问题标题】:Is it possible to create a database using NHibernate?是否可以使用 NHibernate 创建数据库?
【发布时间】:2010-10-29 04:48:20
【问题描述】:

我将 NHibernate 与 FluentNHibernate 一起用于我的 DAL。我还使用SchemaExportSchemaUpdate 来创建和更新我的数据库架构。

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

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

有什么方法可以让 NHibernate 为我创建数据库?

【问题讨论】:

    标签: database nhibernate fluent-nhibernate


    【解决方案1】:

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

    当您想要进行架构更新时,恕我直言,您不应该使用 NHibernate(如果可能的话),因为那不是 NHibernate 的目的;有一种叫做 SQL 的“领域特定语言” :) 擅长做这些事情。

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

    【讨论】:

    • 谢谢,我正在查看 Migrator.Net,看起来很酷,但它并不能解决我实际创建数据库的问题。
    【解决方案2】:

    我自己正在寻找这个,因为我已经在 java 中看到了 - 类似的问题在这里:Generate Database from NHibernate config files

    【讨论】:

    • 这个问题是关于创建数据库,而不是表。
    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

    • 创建 SqlCe 数据库只需要一行代码:new SqlCeEngine( string.Format("Data Source='{0}';", path) ).CreateDatabase();
    • 是的,使用默认配置创建一个sql server数据库并不复杂。但这不是重点。 NH 不这样做是因为它很有意义。
    • 这不再完全正确。使用 NH3,您可以将 hbm2ddl 用作 NHibernate.Tool 命名空间的一部分
    • @burnt_hand:有趣。但我在该代码中也找不到任何类型的“创建数据库”。那么数据库是如何创建的呢?
    • 但这并没有创建数据库,据我所知。它只是创建模式(表、索引等)。
    【解决方案5】:

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

    【讨论】:

    • 谢谢,我将使用它,它不是我真正想要的(NHibernate 做这项工作),但它非常酷。我很惊讶地看到硬编码的“(本地)”数据库服务器参考 :-)
    【解决方案6】:

    如果您开始使用域模型开发应用程序,我认为使用 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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多