0

在处理数据库更改时,我们遇到了过多繁文缛节的问题。也许最奇怪的是,这种繁文缛节适用于内部开发的测试工具,这些工具使用从未投入生产的数据库模式。我们可以在几天内将更改应用于我们的主要测试环境,但我可能需要数周时间才能将其应用于其他测试环境。这对我们使用 NHibernate 造成了严重破坏,因为如果将更新的映射应用于旧数据库,事情就会完全停止工作。我们不会删除列,只会在适当的时候添加更多列。由于偶尔出现错误或一般增强功能,我们会保持我们测试工具的所有版本都是最新的。

如果数据库中不存在映射列(可能在对象上设置默认值),有没有办法让 NHibernate 优雅地忽略它?

我们现在使用 hbm.xml 文件。

4

1 回答 1

0

我认为这更像是一个源代码控制问题。通常,数据库和软件版本应该齐头并进。有了良好的分支和合并策略,您就不应该遇到这种情况。您应该始终拥有与实际生产中的内容相关的源版本(在我看来)。

在我们发布软件/数据库版本的情况下,我们有一个对应于该版本的发布分支。如果需要在添加数据库列的地方进行软件更改,例如,我们将在其中完成工作的开发分支,并且当它准备好在生产中发布时,我们将创建一个与您刚才对应的新发布分支安装在生产中。

如果需要对生产版本进行错误修复,您可以从发布分支分支出来进行错误修复。一旦测试并部署到生产中,您就可以将错误修复分支中所做的更改合并回发布分支,以再次代表生产中的内容。然后,您还可以将该发布分支中的任何更改合并到您的“最新”/主分支。

这里有一些关于各种分支和合并策略的很棒的指南:http: //vsarbranchingguide.codeplex.com/releases

但是要回答您的具体问题,我认为没有很好的方法可以做到这一点。如果它在映射中,nhibernate 将查询它并因此导致错误。

编辑:

您可以在 NHibernate 中做一些事情来只查看某些列。例如,在更新和插入上,您可以设置映射以进行动态插入和更新:

(7) dynamic-update(可选,默认为false):指定UPDATE SQL应该在运行时生成,并且只包含那些值发生变化的列。

(8)dynamic-insert(可选,默认为false):指定INSERT SQL应该在运行时生成,并且只包含值不为null的列。

以上摘自: http: //nhibernate.info/doc/nh/en/#mapping-declaration-class

同样在 nhibernate 查询中,您可以指定要查询的特定列:

IList selection =
    session.QueryOver<Cat>()
        .Select(
            c => c.Name,
            c => c.Age)
        .List<object[]>();
于 2014-02-21T19:37:58.803 回答