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

Pau*_*aul 9 asp.net nhibernate schemaexport

那么,新手NHibernate用户; 试图将我的大脑包裹起来.

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

我认为SchemaExport用于部署可以很好地工作,但我想知道是否有一种方法也让NHibernate以一种基于代码的通用方式告诉我模式导出已经完成或不完成.基本上,我想做像这个伪代码中的东西:

  if(!_cfg.HasSchemaForType(typeof(MyType))
       ExportSchema(typeof(MyType));
  else
       UpdateSchema(typeof(MyType));
Run Code Online (Sandbox Code Playgroud)

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


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

Coc*_*lla 17

我认为你所寻找的SchemaUpdate.Execute不是使用SchemaExport.SchemaUpdate如果模式尚不存在,将创建模式,或者在需要和需要时更新模式.

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

new SchemaUpdate(config).Execute(false, true);
Run Code Online (Sandbox Code Playgroud)


Ste*_*ger 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;
}
Run Code Online (Sandbox Code Playgroud)

对于更新部分,请执行.

public static void UpdateSchema()
{
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg);
    schema.Execute(false, true);
    schema = null;
} // UpdateSchema
Run Code Online (Sandbox Code Playgroud)


Jam*_*Ide 3

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

即使它满足了您的要求,我也不知道这对部署有什么帮助,因为它的目的是从头开始创建数据库。

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

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