C# Nhibernate实体更新一致性

C# Nhibernate实体更新一致性,c#,nhibernate,caching,C#,Nhibernate,Caching,如果我有一个用户对象,其中包含一个UserPhoto对象的集合,当前正在使用NHibernate通过级联更新进行持久化。因此,您保存了用户对象,所有UserPhoto也都被保存了 有没有一种方法可以只通过保存UserPhoto上传一个新的UserPhoto,而不必保存整个用户对象层次结构 我试过了 userPhoto.User = user; // to set the parent object which will provide the UserPhoto with the correct

如果我有一个用户对象,其中包含一个UserPhoto对象的集合,当前正在使用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);
这会使用正确的用户ID将行保存在DB中,但是如果我这样做

session.Get<User>(userId)
session.Get(userId)
它不包含新照片。我猜NHibernate最初是在缓存用户对象,当我在代码的前面得到它时,然后我在DB级别添加userphoto,但是NHibernate缓存仍然包含不引用新照片的较早的用户对象,并且我需要在添加新照片后刷新该用户对象的NHibernate缓存。这是正确的吗?我如何刷新?我是否正确使用了NHibernate


感谢

NHibernate ISession具有一级缓存或实体缓存,当加载用户两次时,这对于hvae引用平等性非常重要。你必须

  • 调用会话。刷新(用户)或
  • 将照片添加到用户集合
我倾向于第二种方法,因为它可以防止会话处于活动状态时出现模型(用户)损坏,并且不需要db往返

如果您不知道用户是否已经加载并且只需要引用,请执行以下操作:

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

if (NHibernateUtil.IsInitialized(user))
{
    user.Photos.Add(userPhoto);
}
var user=session.Load(userId);
userPhoto.User=User;
session.Save(userPhoto);
if(NHibernateUtil.IsInitialized(用户))
{
user.Photos.Add(userPhoto);
}

非常感谢。这是新版本吗?我似乎无法在NHibernate.dll中找到classit是NHibernate.NHibernateUtil