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

ASP.NET Core集成测试:NHibernate+SQLite遇DateTimeOffset兼容问题求助

解决ASP.NET Core集成测试中NHibernate+SQLite的DateTimeOffset问题

针对你遇到的这个问题,结合你不能修改原有NHibernate配置、仅需排除单个DateTimeOffset实体的需求,这里有两个实用的解决方案:

方案一:直接排除问题实体的映射文件

既然那个使用DateTimeOffset的类可以舍弃,我们可以在加载NHibernate映射的时候,手动过滤掉该类对应的.hbm.xml文件,而不是一次性加载整个程序集的所有映射。

把原来的Configuration.AddAssembly(typeof(NHibernateConfiguration).Assembly);替换成以下代码:

var targetAssembly = typeof(NHibernateConfiguration).Assembly;
// 筛选出程序集中所有hbm.xml资源,排除问题实体的映射文件
var validMappingResources = targetAssembly.GetManifestResourceNames()
    .Where(name => name.EndsWith(".hbm.xml"))
    // 替换成你要排除的实体对应的映射文件名,比如ProblematicEntity.hbm.xml
    .Where(name => !name.Contains("ProblematicEntity"));

foreach (var resourceName in validMappingResources)
{
    using (var stream = targetAssembly.GetManifestResourceStream(resourceName))
    {
        Configuration.AddInputStream(stream);
    }
}

这样NHibernate就不会加载那个包含DateTimeOffset属性的实体映射,自然也就不会触发SQLite方言不支持该类型的异常。

方案二:自定义SQLite方言兼容DateTimeOffset

如果你之后可能还需要用到那个实体,或者不想手动筛选映射文件,可以自定义一个SQLite方言,把DateTimeOffset类型映射为SQLite支持的类型(比如TEXT):

首先创建自定义方言类:

public class CompatibleSQLiteDialect : SQLiteDialect
{
    public CompatibleSQLiteDialect()
    {
        // 将DbType.DateTimeOffset映射为SQLite的TEXT类型
        RegisterColumnType(DbType.DateTimeOffset, "TEXT");
    }
}

然后修改你的NHibernate配置中的方言项,指向这个自定义类:

{NHibernate.Cfg.Environment.Dialect, "YourTestProjectNamespace.CompatibleSQLiteDialect, YourTestProjectAssembly"},

这个方案不需要修改原有项目的任何配置或映射,仅在你的集成测试项目中添加这个类即可,SQLite会把DateTimeOffset值以字符串形式存储,满足测试需求。

这两个方案都完全适配你的ASP.NET Core测试环境,也不需要改动原有的.NET Framework NHibernate项目代码。

内容的提问来源于stack exchange,提问作者nocodename

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:18:47