Nhibernate实体更新一致性

时间:2012-11-29 12:34:23

标签: c# nhibernate caching

如果我有一个User对象,其中包含当前使用NHibernate进行级联更新的UserPhoto对象集合。因此,您保存用户对象,并保存所有UserPhoto。

有没有办法只需保存UserPhoto就可以上传新的UserPhoto,而无需保存整个用户对象的层次结构?

我试过了

userPhoto.User = user; // to set the parent object which will provide the UserPhoto with the correct UserId when saving it
session.Save(userPhoto);

使用正确的UserId可以保存数据库中的行,但是如果我那么

session.Get<User>(userId)

它不包含新照片。我猜测NHibernate最初缓存用户对象,当我在代码中得到它时,然后我在数据库级别添加userphoto但NHibernate缓存仍然包含较早的User对象,它没有引用新照片,而我需要在添加新照片后刷新该用户对象的NHibernate缓存。这是正确的,我该如何刷新?我正确使用NHibernate吗?

由于

1 个答案:

答案 0 :(得分:1)

NHibernate ISession有一级缓存或实体缓存,这对于在加载用户两次时引用相同性非常重要。你必须

  • 致电session.Refresh(user)
  • 将照片添加到用户集合

我赞成第二个,因为它可以在会话处于活动状态时防止模型(用户)损坏,并且不需要db往返。

如果您不知道用户是否已加载并且只需要参考,请执行

var user = session.Load<User>(userId);
userPhoto.User = user;
session.Save(userPhoto);

if (NHibernateUtil.IsInitialized(user))
{
    user.Photos.Add(userPhoto);
}