【问题标题】:NHibernate SchemaExport and Configure() catch-22NHibernate SchemaExport 和 Configure() catch-22
【发布时间】:2010-11-04 14:32:47
【问题描述】:

我想在一个新项目中使用DDD 并首先对我的类进行建模,然后根据类库生成数据库模式。我的计划是使用 NHibernate hbm2ddl 工具 SchemaExport 来做到这一点。

问题是我无法让 SchemaExport 工作,因为它让我陷入了一个奇怪的 catch-22 问题。SchemaExport 需要一个 Configuration 对象,该对象本身需要一个有效的 NHibernate 配置文件作为以及一组数据库映射。

这里的第 22 个问题是,当我执行 Configure() 时,它会抱怨 "Could not determine the name of the table for entity 'MyEntity'; remove the 'table' attribute or assign a value to it." 所以 Configure() 方法需要表存在,而 SchemaExport 应该基于 @987654329 创建它@ 我无法创建,因为该表不存在。

那么,我到底应该如何创建一个有效的 NHibernate Configuration,其中包含 SchemaExport 实际做一些有用的事情所需的映射,而没有 Configure() 抛出并抱怨它找不到表用SchemaExport 创建?是否有一个“模式”我可以设置 Configuration 对象,这样它就不会检查数据库是否存在给定的表,或者我需要做些什么吗?

【问题讨论】:

    标签: .net nhibernate hbm2ddl schemaexport


    【解决方案1】:

    你能发布你的配置文件吗?

    我一直使用这种方法,没有表,并且能够动态生成模式。我的猜测是您的 .hbm 文件之一可能有问题。尝试将您的架构缩减为 1 个表,让它工作,然后从那里构建它。作为参考,这里是我用来生成 db 架构的代码:

        var cfg = new Configuration();
        cfg.Configure();
        var schema = new SchemaExport(cfg);
        schema.Create(true, true);
    

    这还将为您将脚本推送到控制台,因此您可以查看针对 db 生成的 SQL。

    【讨论】:

    • 感谢您的提示。由于我自己没有编写 HBM,而是通过 Fluent NHibernate 动态生成它,因此我没有注意到“GetTableName”约定中有错误导致生成的 HBM 中的“table”属性设置为一个空字符串。拿到生成的 HBM 文件后,问题就很清楚了,我能够在几秒钟内修复它。耶! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2011-03-28
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多