在我的nHibernate存储库中创建Update方法

时间:2009-08-18 17:57:13

标签: nhibernate fluent-nhibernate

我当前的存储库看起来像:

 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();但它没有改变数据库中的值。

2 个答案:

答案 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