0

如果我有一个包含 UserPhoto 对象集合的 User 对象,该对象当前正在使用 NHibernate 进行级联更新。所以你保存了用户对象,所有的 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 最初在代码中获取用户对象时正在缓存它,然后我在 DB 级别添加用户照片,但 NHibernate 缓存仍然包含不引用新照片的早期用户对象,我添加新照片后,需要为该用户对象刷新 NHibernate 缓存。这是正确的,我该如何刷新?我正确使用 NHibernate 吗?

谢谢

4

1 回答 1

1

NHibernate ISession 具有一级缓存或实体缓存,这对于加载用户两次时的引用相等性很重要。你必须

  • 打电话session.Refresh(user)
  • 将照片添加到用户收藏

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

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

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

if (NHibernateUtil.IsInitialized(user))
{
    user.Photos.Add(userPhoto);
}
于 2012-11-29T12:43:24.623 回答