NHibernate Session.Merge()未映射属性

NHibernate Session.Merge()未映射属性,nhibernate,Nhibernate,NHibernate中是否有“手动”合并非hibernate映射属性的方法 我的问题是,在从数据库加载实体时设置了一个属性。将实体合并到另一个会话后,该属性的值是错误的,因为hibernate只合并映射的属性 也许有可能在某个地方重载OnMerge(obj entityMergeFrom,object EntityMergeTo)方法之类的东西?我在NHibernate中遇到过类似的问题,如果没有代码,假设启用了延迟加载。为了解决这个问题,我实现了一个函数来避开当前会话上下文。我希望这会有所帮助

NHibernate中是否有“手动”合并非hibernate映射属性的方法

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


也许有可能在某个地方重载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;
    }
公共T GetNotFromCache(Guid id,ISession会话) { 如果(!CurrentSessionContext.HasBind(NHibernate.SessionManager.GetFactory()) { //在此传递具有未映射数据的会话。 CurrentSessionContext.Bind(NHibernate.SessionManager.OpenSession()); } T item=(T)session.Get(id); 会议.驱逐(项目1); T实体=null; //创建新会话以分配实体并在此上下文中处置它 使用(ISession newSession=NHibernate.SessionManager.OpenNewSession()) { 实体=(T)newSession.Get(id); } //合并并绑定到首选会话,然后在上下文中执行get。 合并(实体); CurrentSessionContext.Bind(NHibernate.SessionManager.OpenSession()); 实体=session.Get(id); 返回实体; }