我正在修补 petproject,我用nhibernate它来存储数据。
Nhibernate开箱即用,它不知道如何异步,但原则上我有足够async-await的能力让它中断并开始写入保存操作:
NHibernate.HibernateException: 非法尝试将集合与 NHibernate.Event.Default 中 NHibernate.Event.Default.OnUpdateVisitor.ProcessCollection(Object collection, CollectionType type) 中 NHibernate.Collection.AbstractPersistentCollection.SetCurrentSession(ISessionImplementor session) 中的两个打开会话相关联。 AbstractVisitor.ProcessValue(Object value, IType type) to NHibernate.Event.Default.AbstractVisitor.ProcessValue(Int32 i, Object[] values, IType[] types) to NHibernate.Event.Default.AbstractVisitor.ProcessEntityPropertyValues(Object[] values, IType[] types) 到 NHibernate.Event.Default.AbstractVisitor.Process(Object obj, IEntityPersister persister) 到 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformUpdate(SaveOrUpdateEvent 事件, 对象实体,IEntityPersister 持久化)到 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsDetached(SaveOrUpdateEvent 事件)到 NHibernate.Event.Default.DefaultUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent 事件)到 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveImiberUpdate.eventUpdate(SaveImiberUpdate.event)Ornate SessionImpl NHibernate.Impl.SessionImpl.Update(Object obj) 中的 .FireUpdate(SaveOrUpdateEvent 事件)...NHibernate.Impl.SessionImpl.Update(Object obj) 中的 FireUpdate(SaveOrUpdateEvent 事件)...NHibernate.Impl.SessionImpl.Update(Object obj) 中的 FireUpdate(SaveOrUpdateEvent 事件)...
Heber 设置为CurrentSessionContext<ThreadLocalSessionContext>(),即 据我了解 - 在流上的会话。所有选项似乎都对我没有帮助,或者我不理解帮助。
因此,问题是:
如何在异步应用程序中使用 hiber?同步通话?从会话中取消挂钩对象并将它们挂钩到每个线程中的正确对象?(这实际上会丢弃整个一级缓存)。
NHibernate 没有或不支持异步 API,因此:
尝试使用
AsyncLocalSessionContext. (UPD:尚未在公共版本中提供,但您可以分叉源并自己实现。)尝试使用将运行所有同步 NHibernate 调用的单线程调度程序。
查看其他添加了异步 API 的 ORM/microORM(同样的 Dapper 完美支持异步)或NHibernate分支。如果库与 IO 一起使用,那么现在没有异步 API 不再是严重的问题。