NHibernate Session.Merge()没有映射属性

时间:2013-10-23 07:06:05

标签: nhibernate

NHibernate中有没有办法手动"合并不是hibernate映射的属性?

我的问题是我有一个从数据库加载实体时设置的属性。在将实体合并到另一个会话之后,该属性的值是错误的,因为hibernate仅合并映射的属性。

也许有可能在某处重载像OnMerge(obj entityMergeFrom,object EntityMergeTo)这样的方法吗?

1 个答案:

答案 0 :(得分:0)

我遇到过与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;
    }