我当前的存储库看起来像:
public class Repository<T> : IRepository<T>
{
public ISession Session
{
get
{
return SessionProvider.GetSession();
}
}
public T GetById(int id)
{
return Session.Get<T>(id);
}
public ICollection<T> FindAll()
{
return Session.CreateCriteria(typeof(T)).List<T>();
}
public void Add(T t)
{
Session.Save(t);
}
public void Remove(T t)
{
Session.Delete(t);
}
}
界面:
public interface IRepository<T>
{
T GetById(int id);
ICollection<T> FindAll();
void Add(T entity);
void Remove(T entity);
}
我如何创建更新方法?
我是否必须调用flush或transaciton commit来写入数据库?
我尝试更新对象,并调用saveorupdate();但它没有改变数据库中的值。
答案 0 :(得分:3)
你没有。
存储库模式意味着:“为持久性使用模拟正常集合”
正常收集,我的意思是List<T>
当你这样做时:
var list = new List<User>();
list.Add(myUser);
myUser.MyProperty = newValue;
列表和myUser变量中用户的MyProperty设置为newValue,因为它是相同的引用。这样做会很奇怪:
var list = new List<User>();
list.Add(myUser);
myUser.MyProperty = newValue;
list.Update(myUser);
存储库的行为应与其他集合相同,例如list。当您需要显式更新时,请不要将其称为存储库。收藏不是那样的。
要回答您的问题:是,您必须提交事务或刷新会话以更改持久保存数据库中会话的更改。最好让一个工作单元负责这个而不是存储库,并将工作单元注入存储库而不是会话。
答案 1 :(得分:1)
我们的存储库实际上没有Add方法。相反,我们只有一个Save方法(不喜欢这个名字)。该方法执行Session.SaveOrUpdate(),因为我们在定义中指定了unsaved-value,所以它可以正常工作。
在查看对数据库的实际更改方面,在关闭会话之前不会发生这种情况。这样可以节省NHibernate做任何工作,直到绝对必要。
你需要刷新的唯一原因是你想从你的数据库中获取一个id,但是因为这个原因不是首选身份NHibernate Avoid Identity Generator When Possible