如何使用 NHibernate 模式生成更新数据库表模式?

Posted

技术标签:

【中文标题】如何使用 NHibernate 模式生成更新数据库表模式?【英文标题】:How to update database table schemas with NHibernate schema generation? 【发布时间】:2010-09-26 20:11:45 【问题描述】:

我试图弄清楚如何使用 NHibernate 配置和映射来更新表架构,而不是删除并重新创建它们。

目前我正在使用 NHibernate.Tool.hbm2ddl.SchemaExport obj 和 FluentNHibernate 来为 mysql 数据库生成数据库架构。虽然我不能说这是一个大问题,但每当我在数据库上调用SchemaExport.Execute 时,它都会删除所有表,然后重新创建它们。

如果我可以让它更新现有的表结构,尽可能地保留数据,那会更酷。但我真的不想使用商业产品或代码生成器,因为我一般不喜欢代码生成,而且我不需要这个,我会考虑为此付费。因此,希望任何答案都能牢记这些警告。

【问题讨论】:

查看SchemaUpdate。 【参考方案1】:

SchemaUpdate 对象通过在void Execute(bool script, bool doUpdate) 时显然生成和执行一系列 SQL UPDATE 语句(以及约束语句)来提供数据库模式更新 函数被调用。 SchemaUpdate 类位于 NHibernate.Tool.hbm2ddl 命名空间中,可在 Nhibernate.dll 文件中找到。

在 nhibernate 1.0.2 工具集指南here(第 15.1.5 节)的第 15 章中提到了 SchemaUpdate。

“NHibernate 常见问题解答”(链接现已过期)有一个更完整的示例来说明如何使用 SchemaUpdate:

[Test]
public void Update_an_existing_database_schema()

    _cfg = new Configuration();
    _cfg.Configure();
    _cfg.AddAssembly(Assembly.LoadFrom("DataLayer.dll"));
    var update = new SchemaUpdate(_cfg);
    update.Execute(true, false);

【讨论】:

我们无法修改字段的设置,例如将字符串长度从 nvarchar(255) 修改为 nvarchar(45),可以吗? 这是一个很好的问题,hbm2ddl 的创建版本允许您这样做,但我注意到有时我必须在创建成功运行之前删除表。 这非常有效,这种技术也适用于 Fluent NHibernate。 我可以确认,至少在 SQL Server 上(因此在 Azure 上),字段没有更新,您必须手动进行。 @Astaar:您的意思是从 nvarchar(255) 更改为 nvarchar(45) 不起作用?还是您的意思是架构更新根本不起作用?

以上是关于如何使用 NHibernate 模式生成更新数据库表模式?的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 为新实体生成 INSERT 和 UPDATE

使用 Fluent NHibernate 生成表索引

如何从 NHibernate 映射文件生成“迁移”DDL?

如何更新 Nhibernate 中的 varchar 列长度?

使用 NHibernate 进行级联更新一对多

如何使用 nhibernate 更新主键