我想知道是否有一个现有的方法可以确定一个对象是否仍然存在?例如 IsPersisted(object obj)方法......
检查空值的标识符是可行的我确定,但我还没有完全考虑过这一点,只是想确定没有我遗漏的东西。
谢谢,
贝
答案 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属性。