NHibernate映射完整性检查

时间:2011-08-05 15:15:27

标签: c# nhibernate fluent-nhibernate castle-activerecord

目前,我们的新数据库设计正在快速变化,我并不总是有时间及时了解最新的更改。因此,我想在针对数据库的映射中创建一些基本的集成测试,这些测试基本上是完整性检查

以下是我希望在这些测试中完成的一些事项:

  1. 检测我在映射中未定义但存在于数据库中的列
  2. 检测我已映射的列,但数据库中存在 NOT
  3. 检测我已映射的列,其中数据库与我的业务对象之间的数据类型不再相互依赖
  4. 检测数据库和我的映射之间的列名称更改
  5. 我在Ayende找到了以下article,但我只是想看看其他人在做什么来处理这些事情。基本上我正在寻找涵盖我的大量映射的简化测试,但不要求我为映射中的每个业务对象编写单独的查询。

2 个答案:

答案 0 :(得分:4)

我很满意这个测试,来自Ayende提出的测试:

[Test]
        public void PerformSanityCheck()
        {
            foreach (var s in NHHelper.Instance.GetConfig().ClassMappings)
            {
                Console.WriteLine(" *************** " + s.MappedClass.Name);

                    NHHelper.Instance.CurrentSession.CreateQuery(string.Format("from {0} e", s.MappedClass.Name))
                        .SetFirstResult(0).SetMaxResults(50).List();

            }
        }

我使用普通的旧查询,因为这个版本来自一个非常古老的项目,我懒得用QueryOver或Linq2NH或其他东西更新... 它基本上ping所有已配置的映射实体,并掌握一些数据,以便看到一切正常。它不关心表中是否存在某些字段而不关心映射,如果不可为空则可能会在持久性中产生问题。 我知道Fabio Maulo has something eventually more accurate。 作为个人考虑,如果您正在考虑改进,我会尝试实现这样的策略:由于API可以浏览映射,在地图中查找任何显式/隐式表声明,并使用标准模式与数据库进行ping操作你在NH内部的辅助类(它们最终使用ADO.NET模式类,但是它们将我们在NH本身已经完成的所有配置内容隔离开来)通过使用命名策略,我们可以实现逐个表字段检查列表。如果字段不匹配,可以通过将Levensthein Distance应用于所有可用名称并在满足某些阈值要求时选择一个来寻找候选者,从而完成另一项改进。当NH模式由NH本身生成时,这当然在第一类场景中是无用的。

答案 1 :(得分:0)