2009-08-17 3 views
3

Здравствуй,NHibernate «сохранить» -> «получить» проблема

Я использую NHibernate и имеют проблемы, связанные с регистрации пользователей на моем сайте.

Когда пользователь хочет зарегистрировать создать новую запись пользователя в базе данных и immidiatelly после этого система регистрации пользователя в.

Ну вот лежит проблему ... При создании записи пользователя я использую

NHibernateSession.Save (entity); // не сохраняет объект пользователя немедленно в базу данных. Он хранится в сеансе.

И когда я хочу войти в систему, я загружаю пользователя по его имени пользователя, а затем получаю нулевой объект пользователя.

Почему я получаю нулевой объект и как его заставить работать?

Благодаря

ответ

1

Если ваш Сохранить и получить делаются из различных сессий, то Get возвратит нуль, потому что объект существует только в других сеансов внутреннего кэша, пока он не покраснел.

Я не уверен, что кэш L2 будет иметь значение (я не делаю, если кэш L2 написан в Save или Flush).

+0

Я пошел в режим отладки и проверил идентификаторы сеанса (на сохранение и получение), и они одинаковы. – Goran

+0

нечетным ... пришлось бы провести некоторое тестирование, чтобы понять, что имеет смысл. – anonymous

3

Хорошо, я испытал это:

 ISession session = s.CreateSession(); 

     User user = new User(); 

     user.Number = 122; 
     user.UserName = "u"; 
     user.Id = 1; 

     session.Save(user); 
     User user1 = session.CreateCriteria<User>().Add(Restrictions.Eq("UserName", "u")).UniqueResult<User>(); 

     session.Flush(); 

Сначала выберите в настоящее время выполняется из CreateCriteria, а затем на Flush вставки. Вот почему он ничего не находит.

Я также проверил с Get<User>(1) и возвращает объект, переданный методу сохранения - запрос не выполняется.

По-прежнему - зачем запрашивать базу данных, так как у вас есть объект прямо там?

Также вы говорите, что используете Get, а затем говорите, что хотите загрузить UserName - это имя пользователя первичного ключа? Попробуйте загрузить первичный ключ.

+1

Из блога Айенде (http://ayende.com/Blog/archive/2009/04/30/nhibernate-ndash-the-difference-between-get-load-and-querying-by.aspx): «Получить обычно будет результатом будет выбор из базы данных, но сначала он проверит кеш сеанса и кеш второго уровня, чтобы сначала получить значения ». Я полагаю, что это означает, что если у вас есть Save() и Get() сразу после другого для того же объекта, он не должен попадать в db, но я еще не успел проверить. – anonymous

+0

Хм .. возможно, вы правы - но я до сих пор не понимаю, почему звонок получить, когда у вас есть сущность прямо там. – sirrocco

+0

Я думаю, вам нужна дополнительная информация. – anonymous

Смежные вопросы