nHibernate怎么可能不经过100%编译时测试?

nHibernate怎么可能不经过100%编译时测试?,nhibernate,Nhibernate,nHibernate让我烦恼的一件事是它没有经过100%的编译时测试 如果我重命名数据库表中的一列,并更新该表的映射文件,当我点击compile时,我应该会在所有查询代码(hql/criteria whatever)中得到错误,这些查询代码是我引用该列名的位置以及它的拼写方式 使用ORM的全部要点(对我来说)是数据库更改不会破坏我的查询 换句话说,我将在编译时收到需要修复的内容的通知,而不是获取运行时错误等。Hibernate根据映射配置使用动态字节码生成来创建映射类 ORM的基本点是实现对象和

nHibernate让我烦恼的一件事是它没有经过100%的编译时测试

如果我重命名数据库表中的一列,并更新该表的映射文件,当我点击compile时,我应该会在所有查询代码(hql/criteria whatever)中得到错误,这些查询代码是我引用该列名的位置以及它的拼写方式

使用ORM的全部要点(对我来说)是数据库更改不会破坏我的查询


换句话说,我将在编译时收到需要修复的内容的通知,而不是获取运行时错误等。

Hibernate根据映射配置使用动态字节码生成来创建映射类


ORM的基本点是实现对象和关系系统之间的自动映射(桥接)。因此:ORM.

Hibernate根据映射配置使用动态字节码生成来创建映射类


ORM的基本点是实现对象和关系系统之间的自动映射(桥接)。因此:ORM。

如果您希望强类型化对象,而不是使用xml配置,如果测试不正确,可能会导致许多运行时问题,我将研究FluentNHibernate,它具有约定映射,允许您将类映射到代码中的数据。使我的生活更轻松,特别是当我第一次开始使用NHibernate时,我希望我在知道如何使用xml正确映射之前就找到了它,我将研究FluentNHibernate,它具有约定映射,允许您将类映射到代码中的数据。让我的生活变得更加轻松,尤其是刚开始使用NHibernate时,我希望在我知道如何使用xml正确映射之前就找到它。我以前使用过它,它使您不必担心映射文件(.hml)。它允许您在类级定义上进行更改,映射文件通常未被更改

如果你写的是糟糕的查询,那听起来像是设计问题,而不是nHibernate问题。

你应该看看。我以前使用过它,它使您不必担心映射文件(.hml)。它允许您在类级定义上进行更改,映射文件通常未被更改


如果你写的是糟糕的查询,那听起来像是设计问题,而不是nHibernate问题。

要实现你想要的,我认为你最好的解决方案是结合使用and。Fluent NHibernate将为您提供映射文件的类型安全检查(因此,如果您更改实体上的属性,如果您不同时更改映射类上的属性,编译器将抛出错误)。lambda函数扩展将通过criteriaapi(不是HQL,因为这只是带对象的神奇字符串SQL)为您提供类型安全查询

为了澄清你的问题,你说:

如果我更改了列表中的列(重命名) 数据库表,我更新 当我 点击编译,我应该得到所有的错误 我的查询代码(hql/条件) 我引用该列名的位置 以及它是如何拼写错误的


仅仅更改数据库端应该不会破坏任何东西(假设您也在XML映射文件中进行了更改)。您的代码没有引用映射的
column=“first\u name”
部分,而是引用
name=“FirstName”
部分。如果不更改实体,则在数据库中重命名列(例如,从“
firstname
”重命名为“
first\u name
”)不会中断查询,只要您同时更新映射文件。

要达到您的目的,我认为最好的解决方案是使用和的组合。Fluent NHibernate将为您提供映射文件的类型安全检查(因此,如果您更改实体上的属性,如果您不同时更改映射类上的属性,编译器将抛出错误)。lambda函数扩展将通过criteriaapi(不是HQL,因为这只是带对象的神奇字符串SQL)为您提供类型安全查询

为了澄清你的问题,你说:

如果我更改了列表中的列(重命名) 数据库表,我更新 当我 点击编译,我应该得到所有的错误 我的查询代码(hql/条件) 我引用该列名的位置 以及它是如何拼写错误的


仅仅更改数据库端应该不会破坏任何东西(假设您也在XML映射文件中进行了更改)。您的代码没有引用映射的
column=“first\u name”
部分,而是引用
name=“FirstName”
部分。如果不更改实体,则只要更新映射文件,将数据库中的列(例如从“
firstname
”重命名为“
first\u name
”)不会中断查询。

如果属性名称没有更改,则不会出现错误,由于大多数人在NHibernate中使用HQL进行查询。但是,如果您确实更改了属性名称,而不是HQL,则确实会出现错误的查询,例如:

FROM User Where User.Surname = 'bob'
将姓氏属性更改为Lastname,它将中断。这是NHibernate中缺少的一个功能,但对于contrib来说是一个很好的项目——一个亚音速风格的查询接口。有点类似,但仍然使用HQL


如上所述,是最接近NHibernate的类型检查。这两种方法都强制要求您从其基类继承类,正如您所期望的,并且不打算用于生产-Ayende在一个视频中说,该视频旨在成为NHibernate的原型工具。

如果属性名称没有更改,您将不会出现错误,因为大多数人在NHibernate中使用HQL进行查询。但是,如果您确实更改了属性名称,而不是HQL,您将