Используя NHibernate, я обычно запрашиваю отдельные записи, используя методы Get () или Load () (в зависимости от того, нужен мне прокси или нет):
SomeEntity obj = session.Get<SomeEntity>(new PrimaryKeyId(1));
Теперь, если я выполню этот оператор дважды, как в примере ниже, я увижу только один запрос, выполняемый в моих юнит-тестах:
SomeEntity obj1 = session.Get<SomeEntity>(new PrimaryKeyId(1));
SomeEntity obj2 = session.Get<SomeEntity>(new PrimaryKeyId(1));
Пока все хорошо. Но я заметил странное поведение при получении того же объекта с помощью запроса ICriteria. Проверьте мой код ниже: я получаю первый экземпляр объекта. Затем я изменяю значение свойства на 10 (значение в базе данных равно 8), получаю другой экземпляр и, наконец, проверяю значения второго экземпляра объекта.
//get the first object instance.
SomeEntity obj1 = session.CreateCriteria(typeof(SomeEntity))
.Add(Restrictions.Eq("Id", new PrimaryKeyId(1)))
.UniqueResult<SomeEntity>();
//the value in the database and the property is 8 at this point. Let's set it to 10.
obj1.SomeValue = 10;
//get the second object instance.
SomeEntity obj2 = session.CreateCriteria(typeof(SomeEntity))
.Add(Restrictions.Eq("Id", new PrimaryKeyId(1)))
.UniqueResult<SomeEntity>();
//check if the values match.
Assert.AreEqual(8, obj2.SomeValue);
Теперь по какой-то причине завершение не удается, поскольку значение obj2 равно 10, хотя я запросил объект с новым запросом. Самое смешное, что в соответствии с моим окном вывода модульного теста выполняются 2 абсолютно одинаковых запроса на выборку. Мой вопрос: почему выполняются 2 запроса, если второй объект извлекается из кэша первого уровня?
Я что-то упустил или это ошибка?
С уважением, Тед
edit # 1: использование NHibernate v2.1.2GA
правка № 2: я добавил несколько дополнительных объяснений о двух выполняемых запросах в последний абзац.