处理DBA官僚机构时NHibernate错误

时间:2014-02-21 16:10:00

标签: c# nhibernate nhibernate-mapping hbmxml

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

这里有各种分支和合并策略的精彩指南: http://vsarbranchingguide.codeplex.com/releases

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

编辑:

你可以在NHibernate中做些事情只看某些列。例如,在更新和插入时,您可以设置映射以执行动态插入和更新:

  

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

     

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

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

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

IList selection =
    session.QueryOver<Cat>()
        .Select(
            c => c.Name,
            c => c.Age)
        .List<object[]>();