NHibernate 有没有办法“手动”合并不是休眠映射的属性?
我的问题是我有一个从数据库加载实体时设置的属性。将实体合并到另一个会话后,该属性的值是错误的,因为休眠只合并映射的属性。
也许有可能在某处重载 OnMerge(obj entityMergeFrom, object EntityMergeTo) 方法之类的东西?
NHibernate 有没有办法“手动”合并不是休眠映射的属性?
我的问题是我有一个从数据库加载实体时设置的属性。将实体合并到另一个会话后,该属性的值是错误的,因为休眠只合并映射的属性。
也许有可能在某处重载 OnMerge(obj entityMergeFrom, object EntityMergeTo) 方法之类的东西?
我在 NHibernate 中遇到过类似的问题,并且没有代码我假设启用了延迟加载。为了解决这个问题,我实现了一个躲避当前会话上下文的函数。我希望这个对你有用。这样做是获取当前会话并从上下文中删除实体。然后它创建一个新会话以通过 ID 获取对象,然后处理上下文。最后,我们将“新鲜”实体合并到当前上下文中。如果您想保留未保存的值,您可能需要添加额外的逻辑。
public T GetNotFromCache(Guid id, ISession session)
{
if (!CurrentSessionContext.HasBind(NHibernate.SessionManager.GetFactory()))
{
// the session with unmapped data is passed here.
CurrentSessionContext.Bind(NHibernate.SessionManager.OpenSession());
}
T item = (T)session.Get<T>(id);
session.Evict(item);
T entity = null;
// create a new session to assign the entity and dispose of it within this context
using (ISession newSession = NHibernate.SessionManager.OpenNewSession())
{
entity = (T)newSession.Get<T>(id);
}
// Merge and bind to the preferred session then do a get within the context.
session.Merge<T>(entity);
CurrentSessionContext.Bind(NHibernate.SessionManager.OpenSession());
entity = session.Get<T>(id);
return entity;
}