NHibernate:有没有办法解决一个对象是否持久存在的问题?

时间:2010-09-18 08:10:13

标签: nhibernate

我想知道是否有一个现有的方法可以确定一个对象是否仍然存在?例如 IsPersisted(object obj)方法......

检查空值的标识符是可行的我确定,但我还没有完全考虑过这一点,只是想确定没有我遗漏的东西。

谢谢,

4 个答案:

答案 0 :(得分:4)

这是实体持有者的责任,所以我让它弄明白,而不是手动检查未保存的值:

public bool? IsPersisted(object obj, ISession session)
{
    var sessionFactoryImpl = (ISessionFactoryImplementor)session.SessionFactory;
    var persister = new SessionFactoryHelper(sessionFactoryImpl).RequireClassPersister(obj.GetType().AssemblyQualifiedName);
    return !persister.IsTransient(obj, (ISessionImplementor)session);
}

entity persister does a few more things而不仅仅是检查未保存的值,例如检查版本和二级缓存。而且似乎并不总是能够发现它是否是瞬态的(它返回bool?)。

答案 1 :(得分:3)

根据unsaved-value检查ID是一个好方法。这就是session.SaveOrUpdate方法用于决定是发出INSERT还是UPDATE语句的内容。

答案 2 :(得分:2)

我编写了以下ISession扩展,这似乎有效。如果你有更好的东西,我很高兴看到它。

    public static bool IsNewEntity(this ISession session, object entity)
    {
        if (entity == null) return false;

        ISessionImplementor sessionImpl = session.GetSessionImplementation();
        IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
        EntityEntry oldEntry = persistenceContext.GetEntry(entity);

        return oldEntry == null;
    }

答案 3 :(得分:1)

NHibernate可能会查看三个不同的属性,以查看实体是否持久化。在大多数情况下,根据未保存的值检查Id就足够了。如果分配了Id,则将检查Version或Timestamp属性。

  1. Id - 如果未分配ID,则此方法有效。
  2. 版本 - 如果存在且是否已分配ID。
  3. 时间戳 - 如果存在且是否已分配ID。