You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:10:30