0

NHibernateを使用したカスケード更新で現在永続化されているUserPhotoオブジェクトのコレクションを含むUserオブジェクトがある場合。したがって、ユーザーオブジェクトを保存すると、すべての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を使用してDBの行が正常に保存されますが、

session.Get<User>(userId)

新しい写真は含まれていません。コードの早い段階でユーザーオブジェクトを取得したときにNHibernateが最初にユーザーオブジェクトをキャッシュしていると推測します。次に、DBレベルでユーザー写真を追加しますが、NHibernateキャッシュには、新しい写真を参照しない以前のユーザーオブジェクトがまだ含まれています。新しい写真を追加した後、そのユーザーオブジェクトのNHibernateキャッシュを更新する必要があります。これは正しいですか、どうすれば更新できますか?NHibernateを正しく使用していますか?

ありがとう

4

1 に答える 1

1

NHibernate ISessionには、ユーザーを2回ロードするときに参照の同等性をhvaeするために重要な第1レベルのキャッシュまたはエンティティキャッシュがあります。必ず

  • 電話session.Refresh(user)または
  • ユーザーコレクションに写真を追加します

セッションがアクティブで、dbラウンドトリップを必要としないときにモデル(ユーザー)が壊れることを防ぐため、2番目の方が好きです。

ユーザーがすでにロードされているかどうかわからず、参照が必要な場合は、

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 に答える