NHibernate可以检查是否已生成数据库模式?

时间:2009-06-15 19:18:20

标签: asp.net nhibernate schemaexport

所以,新手NHibernate用户;试图将我的大脑包裹起来。

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

我在考虑使用SchemaExport进行部署会很好用,但我想知道是否有一种方法让NHibernate以一种基于代码的通用方式告诉我模式导出已经完成已经或不是。基本上,我想做像这个伪代码中的东西:

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

这两个函数将分别在内部使用SchemaExportSchemaUpdate


编辑:大家好,我很欣赏到目前为止的答案,但是他们忽略了一点。我正在尝试设置的是一种方法,允许应用程序添加和删除可能需要更改数据库的附加组件。我不是在谈论版本化我自己的代码之类的东西(至少不是它的主要功能)。所以问题不在于我何时部署应用程序,而是关于何时添加或删除插件。是否已经部署过theis插件(因此伪代码类型检查)?如果是,请运行更新。如果没有,请运行导出。有意义吗?

5 个答案:

答案 0 :(得分:17)

我认为您要找的是SchemaUpdate.Execute而不是SchemaExport。如果模式尚不存在,SchemaUpdate将创建模式,或者在需要和需要时更新模式。

这对我来说同时使用MSSQL和SQLite。

new SchemaUpdate(config).Execute(false, true);

答案 1 :(得分:10)

是的,至少在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

答案 2 :(得分:3)

不,NHibernate没有做你所要求的。我想可以编写一些导出模式的代码,然后将其与数据库模式进行比较。但是可能更容易导出到临时数据库并使用第三方工具(例如redgate SQL Compare)来比较模式。

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

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

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

答案 3 :(得分:2)

架构导出的目的是从头开始生成完整的架构。如果您尚未部署应用程序,则非常有用。

首次部署后,我强烈建议您使用迁移工具,它将帮助您进一步扩展/修改架构。如果你想得更多,你会注意到你甚至需要数据操作(例如,删除由于错误而生成的错误数据)随着应用程序的发展。这都是一个迁移工具可以帮助您。

看看:

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

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

答案 4 :(得分:0)

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