【问题标题】:Can I tell if a property is dirty using nhibernate?我可以用 nhibernate 判断一个属性是否脏吗?
【发布时间】:2009-02-12 15:42:31
【问题描述】:

有谁知道是否可以使用 NHibernate 判断对象上的特定属性是否脏(即该属性与存储在 DB 上的属性不同)?

这个问题的背景是我将拥有一个具有(相对)大量属性的对象。我需要能够将参数(字符串)传递给一个函数,该函数将确定该特定属性在页面的生命周期内是否发生了变化。

如果需要,我可以创建对象的副本并在页面生命周期结束时使用反射来检查值,但我不愿意这样做。如果 NHibernate 可以简单地告诉我属性是否脏,那就太好了。

谢谢

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    目前无法通过 nHibernate(或 Hibnernate,AFAIK)API 获得。您可以自己编写类似的内容,方法是在对象加载到会话时存储对象的状态,然后比较它们。

    注意:我自己还没有看到这个,但是,如果你还没有锁定 ORM 选择,你应该看看 Subsonic。对象本身会跟踪很多脏状态,您可以确定特定属性是否脏。

    【讨论】:

      【解决方案2】:

      检查 property 是否脏可以通过手动检查 IPersistenceContext 来实现。我从未尝试过,所以我无法提供确切的代码。您可以参考下面代码示例中的GetEntityEntryFromPersistenceContext 方法并编写您自己的代码来执行此操作。

      您可以轻松检查整个实体是否脏。您可以使用以下实用程序类来了解实体的各种状态,包括脏状态。

      public static class NHibernateUtil
      {
          public static bool IsDirtyEntity<TEntity>(ISession session, TEntity instance) where TEntity : class
          {
              if(IsPersistentEntity(session, instance, true) == false)
              {
                  throw new NhBoilerplateException("This is not a persistent entity.");
              }
      
              ISessionImplementor sessionImpl = session.GetSessionImplementation();
              IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
              EntityEntry oldEntry = sessionImpl.PersistenceContext.GetEntry(instance);
      
              if((oldEntry == null) && (instance is INHibernateProxy))
              {
                  INHibernateProxy proxy = instance as INHibernateProxy;
                  object obj = sessionImpl.PersistenceContext.Unproxy(proxy);
                  oldEntry = sessionImpl.PersistenceContext.GetEntry(obj);
              }
      
              string className = NHibernateProxyHelper.GuessClass(instance).FullName;
              IEntityPersister persister = sessionImpl.Factory.GetEntityPersister(className);
              object[] oldState = oldEntry.LoadedState;
              object[] currentState = persister.GetPropertyValues(instance);
              int[] dirtyProps = persister.FindDirty(currentState, oldState, instance, sessionImpl);
      
              return (dirtyProps != null);
          }
      
          public static bool IsProxyEntity<TEntity>(TEntity instance) where TEntity : class
          {
              if((instance is INHibernateProxy) == false)
                  return false;
              else
                  return true;
          }
      
          public static bool IsPersistentEntity<TEntity>(ISession session, TEntity instance, bool validateProxy) where TEntity : class
          {
              EntityEntry oldEntry = GetEntityEntryFromPersistenceContext(session, instance);
      
              if(oldEntry != null)
                  return true;
      
              if(validateProxy == false)
                  return false;
      
              if(IsProxyEntity(instance) == true)
                  return true;
              else
                  return false;
          }
      
          public static EntityEntry GetEntityEntryFromPersistenceContext<TEntity>(ISession session, TEntity instance) where TEntity : class
          {
              ISessionImplementor sessionImpl = session.GetSessionImplementation();
              IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
              EntityEntry oldEntry = persistenceContext.GetEntry(instance);
              return oldEntry;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2019-09-01
        • 2012-11-04
        相关资源
        最近更新 更多