所以,新手NHibernate用户;试图将我的大脑包裹起来。
我正在考虑如何处理部署,以及稍后向Web应用程序注入附加组件(可能需要自己的持久性类)。
我在考虑使用SchemaExport
进行部署会很好用,但我想知道是否有一种方法让NHibernate以一种基于代码的通用方式告诉我模式导出已经完成已经或不是。基本上,我想做像这个伪代码中的东西:
if(!_cfg.HasSchemaForType(typeof(MyType))
ExportSchema(typeof(MyType));
else
UpdateSchema(typeof(MyType));
这两个函数将分别在内部使用SchemaExport
或SchemaUpdate
。
答案 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)来比较模式。
即使它做了你要求的,我也看不出这对部署有什么帮助,因为它的目的是从头开始创建一个数据库。
编辑添加:假设每个插件都有自己的一组表,您可以使用以下几种方法之一确定是否已部署模式:
答案 3 :(得分:2)
架构导出的目的是从头开始生成完整的架构。如果您尚未部署应用程序,则非常有用。
首次部署后,我强烈建议您使用迁移工具,它将帮助您进一步扩展/修改架构。如果你想得更多,你会注意到你甚至需要数据操作(例如,删除由于错误而生成的错误数据)随着应用程序的发展。这都是一个迁移工具可以帮助您。
看看:
以下是在SO问题中回答的.net更多迁移工具列表:
最初的迁移理念源于Ruby on Rails,过去曾被“克隆”到其他框架中。这就是为什么在http://guides.rubyonrails.org/migrations.html处阅读原始想法绝对是好的。
答案 4 :(得分:0)
如果您有VS Team Suite或Database Developer版本,它可以同步和跟踪更改,然后制作一个部署脚本,为您创建所有正确的对象。另外,RedGate有一个Schema Compare产品,如果我没弄错的话,也可以做同样的事情。