У меня есть старый код, выполняющий запрос, в котором модель может быть временной. То есть модель с некоторыми полями, заполненными пользовательским вводом, которые затем используются как часть запроса. Он работал в NH 2.1.x, но не работает в последней версии.
Вызвано исключение: «объект ссылается на несохраненный переходный экземпляр — сохраните переходный экземпляр перед очисткой». Это происходит, когда NH пытается выполнить запрос, используя не сохраняемый объект как часть запроса.
Упрощенная версия для иллюстрации проблемы.
abstract class BaseModel
public virtual long Id { get; set; }
class Car : BaseModel
public virtual Engine Engine { get;set; }
class Engine : BaseModel
public virtual string Kind { get; set; }
public static IList<Car> GetByEngine(Engine eng) {
ICriteria c = Session.CreateCriteria<Car>();
c.Add(Expression.Eq("Engine", eng));
return c.List<Car>(); // <--- Error occurs here
}
И код вызова эквивалентен этому:
Engine obj = new Engine { Id = 42 }; // Transient instance
var x = GetByEngine(obj);
Я ожидал, что произойдет (что похоже на поведение старой версии NHibernate), так это то, что переданный движок используется только для получения идентификатора. То есть генерация SQl типа select.... from Cars where Engine = 42
Но с новой версией NHibernate, кажется, проверяет, что движок, используемый в Expression, действительно сохраняется.
Есть ли способ избежать загрузки постоянного движка перед выполнением запроса?