2009-06-15 97 views
8

那么,新手NHibernate的用户;试图围绕它围绕我的大脑。NHibernate可以检查数据库模式是否已经生成?

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

我在考虑使用SchemaExport进行部署会效果不错,但我想知道是否有办法让NHibernate以通用的,基于代码的方式告诉我已经完成了模式导出,或者不。基本上,我想做smething想在这个伪代码:

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

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


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

回答

3

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

即使它做了你所要求的,我也没有看到这将如何帮助部署,因为它的目的是从头创建一个数据库。

编辑补充:假设每个插件都有自己的一套表,你可以决定是否架构已采用多种方法之一部署:

  • 尝试加载插件对象之一,赶上例外。
  • 检查数据库模式(使用SMO for SQL Server)检查表是否存在。
  • 部署插件时在表中创建记录。
+1

没有试图解决部署应用程序的问题。我添加了一些额外的说明来澄清。感谢您的答复! – Paul 2009-06-16 11:50:11

+0

我不认为他意味着在部署时......这必须是在运行时或初始化时间......插件必须为他们自己的依赖负责。 – Webjedi 2009-06-16 14:50:14

+0

谢谢;因为它是最完整的,所以我将你标记为“已回答”。我想单独关注跟踪哪些插件已被部署可能是最好的途径,正如您在第三个项目符号中所建议的那样。 – Paul 2009-06-16 15:02:03

0

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

2

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

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

看看到:

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

原点从Ruby on Rails开始的迁移概念,并在过去被“克隆”到其他框架中。这就是为什么在http://guides.rubyonrails.org/migrations.html也能读到最初的想法。

16

我认为你要找的是SchemaUpdate.Execute而不是SchemaExportSchemaUpdate将创建架构,如果它尚不存在,或者如果需要和需要更新它。

这适用于我同时使用MSSQL和SQLite。

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

是有,在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 
相关问题