У меня есть старый код, который выполняет запрос, где модель может быть переходной.То есть модель с некоторыми полями, заполненными пользовательским вводом, которые затем используются как часть запроса.Он работал в 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
}
И вызывающий код эквивалентенthis:
Engine obj = new Engine { Id = 42 }; // Transient instance
var x = GetByEngine(obj);
То, что я ожидал (что похоже на поведение старой версии NHibernate), заключается в том, что переданный Engine используется только для получения идентификатора.То есть, генерируя SQl, как select .... from Cars, где Engine = 42
Но в новой версии NHibernate, похоже, проверяет, что двигатель, используемый в Expression, действительно сохраняется.
IsЕсть ли способ избежать необходимости загружать сохраненный движок перед выполнением запроса?