Я новичок в NHibernate и был назначен на задачу, где мне нужно изменить значение свойства объекта, а затем сравнить, отличается ли это новое значение (кэшированное) от фактического значения, хранящегося в БД. Однако каждая попытка получить это значение из БД приводила к кешированному значению. Как я уже сказал, я новичок в NHibernate, возможно, это легко сделать, и, очевидно, это можно сделать с помощью простого ADO.NET, но клиент требует, чтобы мы использовали NHibernate для каждого доступа к БД. Чтобы прояснить ситуацию, это были мои «успешные» попытки (т.е. без ошибок):
1
DetachedCriteria criteria = DetachedCriteria.For<User>()
.SetProjection(Projections.Distinct(Projections.Property(UserField.JobLoad)))
.Add(Expression.Eq(UserField.Id, userid));
return GetByDetachedCriteria(criteria)[0].Id; //this is the value I want
2
var JobLoadId = DetachedCriteria.For<User>()
.SetProjection(Projections.Distinct(Projections.Property(UserField.JobLoad)))
.Add(Expression.Eq(UserField.Id, userid));
ICriteria criteria = JobLoadId.GetExecutableCriteria(NHibernateSession);
var ids = criteria.List();
return ((JobLoad)ids[0]).Id;
Надеюсь, я дал понять, что иногда трудно объяснить проблему, даже если вы не совсем понимаете основную структуру.
Редактировать: Конечно, это тело метода.
Редактировать 2: Я обнаружил, что он не работает должным образом, поскольку вызов метода находится внутри контекста транзакции. Если я удаляю транзакцию, она работает нормально, но мне нужно, чтобы она была в этом контексте.