NHibernate 可以检查数据库模式是否已生成吗?
-
13-09-2019 - |
题
所以,NHibernate 新手用户;试图让我的大脑围绕它。
我正在考虑如何处理部署,以及稍后将附加组件注入到 Web 应用程序(这可能需要它们自己的持久性类)。
我在想使用 SchemaExport
部署会工作得很好,但我想知道是否有一种方法可以让 NHibernate 以一种常见的、基于代码的方式告诉我模式导出是否已经完成。基本上,我想做这样的伪代码:
if(!_cfg.HasSchemaForType(typeof(MyType))
ExportSchema(typeof(MyType));
else
UpdateSchema(typeof(MyType));
这两个函数将在内部使用 SchemaExport
或者 SchemaUpdate
, , 分别。
编辑:伙计们,我很欣赏到目前为止的答案,但他们有点没有抓住重点。我试图设置的是应用程序允许添加和删除可能需要更改数据库的附加组件的方法。我不是在谈论对我自己的代码等进行版本控制(至少不是其主要功能)。因此,问题不在于我何时部署应用程序,而更多在于我何时添加或删除插件。之前是否部署过 theis 插件(因此是伪代码类型检查)?如果是这样,请运行更新。如果没有,请运行导出。合理?
解决方案
不,NHibernate 不会执行您所要求的操作。我想可以编写一些导出模式的代码,然后将其与数据库模式进行比较。但导出到临时数据库并使用第 3 方工具(例如 redgate SQL Compare)来比较架构可能会更容易。
即使它满足了您的要求,我也不知道这对部署有什么帮助,因为它的目的是从头开始创建数据库。
编辑添加:假设每个插件都有自己的一组表,您可以使用以下几种方法之一确定架构是否已部署:
- 尝试加载插件对象之一并捕获异常。
- 检查数据库架构(使用 SQL Server 的 SMO)以检查表是否存在。
- 部署插件时在表中创建一条记录。
其他提示
我认为你正在寻找的是SchemaUpdate.Execute
而不是使用SchemaExport
。 SchemaUpdate
将创建模式,如果它不存在,或者如果需要和期望的更新。
这同时使用MSSQL和适合我的SQLite。
new SchemaUpdate(config).Execute(false, true);
是有,在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
模式导出的目的是从头开始生成完整的模式。如果您尚未部署应用程序,这非常有用。
第一次部署后,我强烈建议使用迁移工具,它将帮助您进一步扩展/修改架构。如果您多想一点,您会发现您甚至需要数据操作(例如随着应用程序的发展,删除由于错误而生成的错误数据。这就是迁移工具可以帮助您的全部内容。
看看:
以下是在 SO 问题中回答的更多 .net 迁移工具的列表:
迁移的最初想法源自 Ruby on Rails,过去已被“克隆”到其他框架中。这就是为什么阅读原始想法绝对是件好事 http://guides.rubyonrails.org/migrations.html 也。
如果你有VS团队套件或数据库开发人员版,它可以同步和跟踪变化,然后作出部署脚本,将创建所有适合你的对象。此外展鹏有一个架构比较产品,做同样的事情,如果我没有记错。