Фиксация в nhibernate

#c# #sql #nhibernate

#c# #sql #nhibernate

Вопрос:

Я создал простой тест для NHibernate, но это не нормально. Кто-нибудь знает об этой проблеме ниже.

идентификатор экземпляра PosDAL.Users изменен с 4 (System.Int32) на 0 (System.Int32)

идентификатор экземпляра пользователей изменен с 4 (System.Int32) на 0 (System.Int32)

Я использую Sql Server 2008. Таблица пользователей в БД с идентификатором является первичным ключом и автоматически увеличивается на 1. В БД я добавляю простую строку, например: имя пользователя, адрес электронной почты, полное имя …. и т.д. вручную. Идентификатор был 4 . Но это не сработало. Я удалил эту строку, программа запустилась нормально.

Моя функция на уровне BussinessLogic:

 public bool CheckLogin(string sUsername, string sEnCodePassw)
        {
            using(ISession session = SessionFactory.OpenSession())
             using (ITransaction tx = session.BeginTransaction())
             {
                 IList oUser = 
                     session
                     .CreateSQLQuery("SELECT * FROM USERS WHERE U_USERNAME = ?")
                     .AddEntity(typeof(Users))
                     .SetString(0, sUsername)
                     .List();
                 tx.Commit();
                 return false;
             }
        }
  

Ответ №1:

Вам не нужна транзакция для выбора и, само собой разумеется, что вам не нужно ничего фиксировать, потому что вы не изменяете никаких данных. Итак, попробуйте избавиться от транзакции…

 using(ISession session = SessionFactory.OpenSession())
         {
             IList oUser = 
                 session
                 .CreateSQLQuery("SELECT * FROM USERS WHERE U_USERNAME = ?")
                 .AddEntity(typeof(Users))
                 .SetString(0, sUsername)
                 .List();
             return false;
         }
  

Также убедитесь, что ваша кодовая логика действительно выполняет то, что она должна делать. В настоящее время ваш код всегда будет возвращать false, вам следует изменить оператор return на что-то вроде этого…

 return oUser != null amp;amp; oUser.Count > 0;
  

Комментарии:

1. Спасибо за вашу рекомендацию. У меня есть другие идеи, но они возвращают false: <br/> return oUser.Contains(sEnCodePassw); <br/> Что-то не так?

2. Прохладный… Я не заметил, что вы отредактировали свой первый комментарий, задав вопрос

3.Вот мое решение: я меняю — IList oUser = …List() ; в IList<Users> oUser = .....List<Users>(); <br/> User oObject = new User(); <br/> oObject = oUser[0]; <br/> return (oObject != null amp;amp; oObject.Password = sEncodePassw); <br/>