NHibernate映射无表对象遇验证错误,如何获取数据库时间?
问题解答
1. 能否不依赖表/视图映射对象?
NHibernate的实体映射必须关联一个关系数据源(表、视图或虚拟查询),因为它的核心设计是对象与关系数据的映射。但可以通过Subselect将实体映射到一个SQL查询的结果,而非物理表/视图,以此实现“无实体表”的映射。
2. 获取数据库时间的正确方案
你当前的映射报错是因为缺少表关联,结合需求,推荐两种可行方案:
方案一:用Subselect映射虚拟实体
修改你的映射类,通过Subselect指定一个返回当前UTC时间的SQL查询,将其作为虚拟表关联到实体:
public class DatabaseInfoMap : ClassMapping<DatabaseInfo> { public DatabaseInfoMap() { // 用Subselect定义虚拟数据源,返回包含CurrentDateTime的结果集 Subselect("SELECT CURRENT UTC TIMESTAMP AS CurrentDateTime"); // 映射属性,这里不需要额外Formula,因为Subselect已经返回对应字段 Property(x => x.CurrentDateTime); } }
之后你就可以像查询普通实体一样获取数据库时间:
var dbTime = session.Query<DatabaseInfo>().Single().CurrentDateTime;
方案二:直接执行原生SQL查询(更轻量)
如果不需要映射实体,直接通过NHibernate执行原生SQL获取时间是更简单的方式,无需额外映射类:
// 针对不同数据库调整SQL语句,比如SQL Server用GETUTCDATE(),MySQL用UTC_TIMESTAMP() var dbTime = session.CreateSQLQuery("SELECT CURRENT UTC TIMESTAMP AS CurrentDateTime") .UniqueResult<DateTime>();
补充说明
- 如果你只是需要在已有实体中添加数据库时间字段,使用
Formula是可行的,但该实体必须已关联到某个表/视图。 - 注意不同数据库的UTC时间函数差异:比如SQL Server是
GETUTCDATE(),PostgreSQL是CURRENT_TIMESTAMP AT TIME ZONE 'UTC',MySQL是UTC_TIMESTAMP(),需要根据你的数据库类型调整SQL。
内容的提问来源于stack exchange,提问作者zayden
相关产品推荐
相关产品推荐

