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
相关产品推荐
相关产品推荐

