首页 文章

使用nHibernate检索数据库模式

提问于
浏览
3

是否有可能从nHibernate生成数据库的模式,我已经为数据库提供了nHibernate配置,但我没有编写任何映射 .

我希望以编程方式获取Database MetaData / Schema .

我正在使用Oracle数据库 . 我尝试了两种方法:

Approach one:

public DatabaseMetadata GetMetadata(DbConnection connectionIn)
    {
        return new DatabaseMetadata(connectionIn, _dialect);
    }

Problem: 这似乎是我需要的,但是,虽然它正确连接,但它没有拿起我的任何表 . 我提供的只是nHibernate Configuration对象,它填充了我的nHibernate.xml.config文件(连接字符串,驱动程序客户端等)的内容 .

Question: 为什么不返回表格数据?它连接正确但什么也没找到!

Approach two:

public void DatabaseSchema()
 {
     var schema = new SchemaExport(nHibernateConfiguration);
     schema.SetOutputFile("schema.dll");
      schema.Create(true, true);
 }

nHibernateConfiguration是nHibernate Configuration对象的实例(类的属性),填充了nHibernate.xml.config类中的内容 .

Problem: 这根本不起作用 . 崩溃时出现以下异常:

NHibernate.MappingException:Dialect不支持身份密钥生成

我怀疑这只会根据你创建的映射生成一个模式?我没有创建映射 . 这个想法是这将对我连接的任何数据库起作用,为它生成一个模式 .

Question: 我相信这个方法只会根据我的映射生成一个Schema吗?如果没有,我是否正确使用它?

希望这很清楚,如果我需要提供更多信息,请发表评论 .

提前致谢 .

要明确:我有一个数据库,并希望获得表示数据库的元数据,即模式 .

3 回答

  • 1

    NHibernate实际上是基于映射文件 . 您可以从中生成类或表 . 有一些工具可以生成映射文件,但它们基于类,而不是表 .

    您特定问题的答案:

    Approach one: NHibernate不读取数据库中的表定义 . 需要在映射文件中指定所有表定义 .

    Approach two: SchemaExport 从映射定义创建SQL文件(创建表,索引等) . 实际上建议使用它,除非您需要处理旧数据库 . 输出文件应该被称为* .sql,而不是* .dll .

    您得到的错误很可能是因为您尝试在oracle数据库(或其他不支持标识列)上创建标识标识 . 改为使用hilo(或者,如果你不喜欢它,请使用guid.comb或native) . 我只是想知道你为什么会得到这个错误,我以为你没有写任何映射文件?

    结论:

    我不知道从数据库表创建NHibernate映射文件的任何工具 . 可能有一个,很可能它不是自由的或不成熟的(因为否则它将是众所周知的) . 所以我建议考虑生成表定义,或者,如果你有遗留数据库,你需要手动编写映射文件 .

  • 3

    有几种工具可以帮助你,但我使用的最多的是以下两种 .

    如果您已有模式,则可以使用NHibernate Mapping Generator创建映射 . 然后,您可以根据需要使用映射 . 修改它们并使用NHibernate Schema Tool来管理实际的模式 .

    如果您没有任何架构,那就是您要创建的内容,那么您就是在正确的轨道上 . 首先,您需要“映射”您的课程 . 最好使用像Michael Maddox建议的Fluent NHibernate或ConfORM .

    我不知道这个的目的 . 如果是数据库模式管理,我建议不要使用NHibernate . NHibernate从未被开发为模式管理器工具,所以它可能不应该以这种方式使用 . 不可否认,我可能会以某种方式误解你,这个答案可能是完全错误的 .

  • 3

    我可能会错误地解释这个问题,但你所要求的并不是很清楚 .

    假设您已经创建了类并正确配置了NHibernate,并且您希望在数据库中为这些类创建表,那么您至少有两种方法可以尝试生成数据库而无需创建NHibernate映射,这两种方法都可能在以下方面更好地工作 . 至少有一些关于如何进行映射的提示:

    Fluent NHibernate Automapper

    ConfORM

    两种选择都有一个不错的学习曲线 .

    另一种选择是为NHibernate尝试一个商业视觉设计师,尽管这些工具还不够成熟,不能在我的经验中做到这一点 .

    核心NHibernate不是为没有映射文件而创建表而设计的 .

相关问题