nhibernate 的一个经常被忽视的特点是公式属性的使用。公式属性是不映射到数据库中的列, 而是使用原始 sql 查询映射的属性。
公式在 nhibernate 映射文件中使用与普通属性相同的属性元素进行映射, 只需替换公式关键字的列关键字即可。
<property name="FormulaPropertyName" formula="SQL STATEMENT"></property>
基本思想是, 当 nhibernate 加载对象时, 它将同时颁发自定义 sql, 从而允许复杂的只读属性将其工作卸载到数据库中。
例如, 假设您有一个表示电子商务网站上订单的类。订单通常由行项目组成, 一个常见的问题是作为一个整体问订单 "你的小计是什么?" 在不权衡利弊的情况下, 假设您不想将小计作为字段存储在订单表中。
一个完全可以接受的解决方案是具有这样的只读属性:
公共十进制子总计 { 获取 { 十进制小总计 = 0; 在这里。线项目) { 小道达尔 + = 李。延长价格;即, 单位订购的时间单价。 } 返回小计; } }
然而, 这是关于 nhiber配方的帖子。因此, 为了这篇文章的目的, 假设 (无论出于何种原因), 你不能或不想循环访问每个行项目来计算你的小计。然后, 您可以使用 nhibernate 公式将上述功能替换为以下映射。
<property name="SubTotal" access="field.camelcase-underscore" name="SubTotal" access="field.camelcase-underscore"></property name="SubTotal" access="field.camelcase-underscore"> 公式 = "从 lines 项中选择总和 (单位 * 价格), 其中 linerites. 订单号 = 此。订单号 "/>
订单类可以更新, 如下所示:
私有十进制 _ 小数; 公共十进制子总计 { 获取 {返回 _ 小总计;} }
上面的例子很简单, 忽略了几个现实世界的问题, 它的意图仅仅是演示 nhibernate 公式的用法。我发现公式的用途有限, 但在某些特定于应用程序的方案中, 它们可以派上用场。