NHibernate映射带where子句的表时,如何设置列静态值实现插入?
NHibernate映射复合键表时固定某一键列值的处理方案
我需要给一个包含复合键的表配置NHibernate映射,只处理second列值固定为1的数据,同时要求Entity类仅保留First和Value两个属性。
最初尝试的问题
一开始用where子句过滤数据,查询和更新操作都正常,但插入新数据时触发错误:cannot insert NULL into SECOND——因为NHibernate不会自动解析where子句里的条件,把1添加到insert语句中。
最初的映射配置:
<class name="Entity" table="table" where="second = 1"> <id name="First" column="first" /> <property name="Value" column="value" /> </class>
临时的不优雅方案
我曾通过给Entity类添加一个只读的Second属性,映射复合键来实现插入,但这个方案让实体类多了冗余属性:
映射配置:
<class name="Entity" table="table" where="second = 1"> <composite-id> <key-property name="First" column="first" /> <key-property name="Second" column="second" /> </composite-id> <property name="Value" column="value" /> </class>
C#实体类:
public class Entity { public int First { get; set; } public int Second { get { return 1; } set { } } public int Value { get; set; } }
更优雅的解决方案
不需要修改实体类,直接在映射配置中为second列设置静态固定值,让NHibernate自动在insert语句中带上该值:
<class name="Entity" table="table" where="second = 1"> <id name="First" column="first" /> <!-- 配置second列固定为1,不映射到实体属性 --> <property column="second" access="noop" formula="'1'" /> <property name="Value" column="value" /> </class>
配置说明
access="noop":告诉NHibernate不需要将该列映射到实体类的任何属性,避免实体类出现冗余字段。formula="'1'":指定该列的静态值为1,NHibernate在生成insert语句时会自动包含second = 1的赋值,解决插入时的NULL错误。- 保留原有的
where="second = 1"子句,确保查询和更新操作只处理目标数据。
这样配置后,实体类依然只需要First和Value两个属性,所有CRUD操作都能正常工作,且无需冗余代码。
内容的提问来源于stack exchange,提问作者patart
相关产品推荐
相关产品推荐

