代码之家  ›  专栏  ›  技术社区  ›  Damien

使用nhibernate检索数据库模式

  •  3
  • Damien  · 技术社区  · 16 年前

    是否可以从nhibernate生成数据库的模式,在那里我向nhibernate提供了数据库的配置,但我没有编写任何映射。

    我希望以编程方式获取数据库元数据/模式。

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

    方法一:

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

    问题: 不过,这似乎是我需要的,尽管它连接正确,但它没有占用我的任何一张桌子。我提供的只是一个nhibernate配置对象,它由nhibernate.xml.config文件(连接字符串、驱动程序客户端等)的内容填充。

    问题: 为什么它不返回表数据?连接正确,但一无所获!

    方法二:

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

    nhibernate configuration是nhibernate配置对象的实例(类上的属性),由nhibernate.xml.config类中的内容填充。

    问题: 这根本不起作用。发生以下异常的崩溃:

    nhibernate.mappingException:方言 不支持标识密钥 一代

    我怀疑这只会根据您创建的映射生成架构?我没有创建映射。我的想法是,无论我连接到哪一个数据库,它都能为它生成一个模式。

    问题: 我是否相信这个方法只会基于我的映射生成一个模式?如果没有,我是否正确使用它?

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

    事先谢谢。

    清楚地说:我有一个数据库,我想得到表示数据库的元数据,一个模式。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Stefan Steinegger    16 年前

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

    具体问题的答案:

    方法一: nhibernate不从数据库中读取表定义。所有表定义都需要在映射文件中指定。

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

    您得到的错误很可能是因为您试图在Oracle数据库(或另一个不支持标识列的数据库)上创建标识ID。使用hilo代替(或者,如果您不喜欢,使用guid.comb或native)。我只是想知道为什么会出现这个错误,我以为你没有写任何映射文件?

    结论:

    我不知道有什么工具可以从数据库表中创建nhibernate映射文件。可能有一个,最可能的是它不是自由的或不成熟的(否则它将是众所周知的)。因此,我建议考虑改为生成表定义,或者,如果您有一个遗留的数据库,您需要手动编写映射文件。

        2
  •  3
  •   mhenrixon    16 年前

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

    1. NHibernate Schema Tool
    2. NHibernate Mapping Generator

    如果您已经有了一个模式,那么可以使用nhibernate映射生成器来创建映射。然后,您可以为您想要的任何内容使用映射。修改它们并使用nhibernate模式工具来管理实际的模式。

    如果您没有任何模式,而这正是您试图创建的模式,那么您就处于正确的轨道上。首先,你需要“映射”你的课程。最好使用流利的NHiberinate或像Michael Maddox建议的那样。

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

        3
  •  1
  •   Michael Maddox    16 年前

    我可能把问题解释错了,你到底在问什么还不太清楚。

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

    Fluent NHibernate Automapper

    ConfORM

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

    另一种选择是尝试NHibernate的一个商业视觉设计师,尽管这些工具还不够成熟,以我的经验来说还不能很好地做到这一点。

    核心nhibernate的设计或目的不是创建没有映射文件的表。