9

所以,新手 NHibernate 用户;试图将我的大脑包裹在它周围。

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

我在想使用SchemaExport部署会很好地工作,但我想知道是否有办法让 NHibernate 以一种常见的、基于代码的方式告诉我模式导出是否已经完成。基本上,我想在这个伪代码中做一些事情:

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

其中两个函数将分别在内部使用SchemaExportor SchemaUpdate


编辑:伙计们,我很欣赏到目前为止的答案,但他们有点忽略了这一点。我正在尝试设置的是应用程序允许添加和删除可能需要更改数据库的附加组件的方法。我不是在谈论对我自己的代码等进行版本控制(至少,不是作为它的主要功能)。所以问题不在于我何时部署应用程序,而在于我何时添加或删除插件。之前是否部署了 theis 插件(因此是伪代码类型检查)?如果是这样,请运行更新。如果没有,请运行导出。说得通?

4

5 回答 5

17

我认为您正在寻找的是SchemaUpdate.Execute而不是使用SchemaExport. SchemaUpdate如果架构尚不存在,将创建架构,或者在需要和需要时更新架构。

这对我使用 MSSQL 和 SQLite 都有效。

new SchemaUpdate(config).Execute(false, true);
于 2009-09-18T18:50:55.653 回答
11

是的,至少在 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
于 2010-10-31T11:44:24.040 回答
3

不,NHibernate 不会按照您的要求进行操作。我想可以编写一些导出模式的代码,然后将其与数据库模式进行比较。但是导出到临时数据库并使用 3rd 方工具(例如 redgate SQL Compare)来比较模式可能会更容易。

即使它完成了您的要求,我也看不出这对部署有何帮助,因为它的目的是从头开始创建数据库。

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

  • 尝试加载插件对象之一并捕获异常。
  • 检查数据库架构(使用 SMO for SQL Server)以检查表是否存在。
  • 部署插件时在表中创建记录。
于 2009-06-15T19:39:57.613 回答
2

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

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

看看:

以下是在 SO 问题中回答的更多 .net 迁移工具列表:

迁移的最初想法起源于 Ruby on Rails,过去曾被“克隆”到其他框架中。这就是为什么在http://guides.rubyonrails.org/migrations.html上阅读原始想法绝对是一件好事。

于 2009-06-16T01:27:21.833 回答
0

如果您有 VS Team Suite 或 Database Developer 版本,它可以同步和跟踪更改,然后制作一个部署脚本,为您创建所有正确的对象。如果我没记错的话,RedGate 还有一个 Schema Compare 产品可以做同样的事情。

于 2009-06-15T19:43:10.163 回答