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

nhibernate能否检查是否已生成db模式?

  •  9
  • Paul  · 技术社区  · 15 年前

    所以,新来的无纤维使用者,想把我的大脑包起来。

    我正在考虑如何处理部署,以及稍后向Web应用程序注入附加组件(这可能需要它们自己的持久性类)。

    我想用 SchemaExport 因为部署会很好地工作,但是我想知道是否有一种方法可以让nhibernate以一种通用的、基于代码的方式告诉我模式导出已经完成了,或者没有。基本上,我想在这个伪代码中做类似的事情:

      if(!_cfg.HasSchemaForType(typeof(MyType))
           ExportSchema(typeof(MyType));
      else
           UpdateSchema(typeof(MyType));
    

    这两个函数将在内部使用 模式输出 SchemaUpdate ,分别。


    编辑:伙计们,到目前为止我很感激你们的回答,但他们遗漏了一点。我尝试设置的是应用程序允许添加和删除可能需要更改数据库的附加组件的方法。我不是在说版本控制我自己的代码或类似的东西(至少,不是它的主要功能)。因此,问题不在于我何时部署应用程序,而在于我何时添加或删除插件。他们的插件(因此伪代码类型检查)以前部署过吗?如果是,运行更新。如果没有,运行导出。有道理?

    5 回复  |  直到 8 年前
        1
  •  3
  •   Jamie Ide    15 年前

    不,NHibernate不会按你的要求做。我认为可以编写一些导出模式的代码,然后将其与数据库模式进行比较。但将其导出到临时数据库并使用第三方工具(如RedgateSqlCompare)比较模式可能更容易。

    即使它按照您的要求做了,我也看不出这对部署有什么帮助,因为它的目的是从头创建一个数据库。

    编辑添加:假设每个插件都有自己的表集,您可以确定是否已使用以下几种方法之一部署架构:

    • 尝试加载一个插件对象并捕获异常。
    • 检查数据库架构(使用SMO for SQL Server)以检查表是否存在。
    • 部署插件时在表中创建记录。
        2
  •  17
  •   Cocowalla    15 年前

    我想你要找的是 SchemaUpdate.Execute 而不是使用 SchemaExport . SchemaUpdate 如果架构尚不存在,将创建该架构,或者根据需要更新该架构。

    这对我来说既可以使用mssql也可以使用sqlite。

    new SchemaUpdate(config).Execute(false, true);
    
        3
  •  10
  •   Stefan Steiger Marco van de Voort    8 年前

    是的,至少有3.0版

    public static bool ValidateSchema()
    {
        NHibernate.Tool.hbm2ddl.SchemaValidator myvalidator = new NHibernate.Tool.hbm2ddl.SchemaValidator(m_cfg);
        try
        {
            myvalidator.Validate();
            myvalidator = null;
            return true;
        }
        catch (Exception ex)
        {
            MsgBox(ex.Message, "Schema validation error");
        }
        finally
        {
            myvalidator = null;
        }
    
        return false;
    }
    

    对于更新部分,请执行。

    public static void UpdateSchema()
    {
        NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg);
        schema.Execute(false, true);
        schema = null;
    } // UpdateSchema
    
        4
  •  2
  •   Community paulsm4    7 年前

    模式导出的目的是从头生成完整的模式。如果你还没有部署你的应用程序,这真的很有用。

    在第一次部署之后,我强烈建议使用迁移工具,它将帮助您进一步扩展/修改模式。如果您提前考虑一点,您会注意到,随着应用程序的发展,您甚至需要进行数据操作(例如删除由于错误而生成的错误数据)。这就是迁移工具可以帮助您完成的全部工作。

    看看:

    下面是在一个SO问题中回答的.NET迁移工具的更多列表:

    迁移的最初想法起源于RubyonRails,并在过去被“克隆”到其他框架中。这就是为什么在 http://guides.rubyonrails.org/migrations.html 也是。

        5
  •  0
  •   Webjedi    15 年前

    如果您有vs team suite或database developer版本,它可以同步和跟踪更改,然后生成一个部署脚本,为您创建所有合适的对象。另外,Redgate有一个模式比较产品,如果我没弄错的话,它也会做同样的事情。