我有一些旧代码正在执行一个模型可以是瞬态的查询。也就是说,一个模型包含一些从用户输入中填充的字段,然后将其用作查询的一部分。它在 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 版本的行为)是传递的引擎仅用于获取 Id。也就是说,生成 SQl 之类的 select .... from Cars where Engine = 42
但是在新版本中,NHibernate 似乎会检查表达式中使用的引擎是否实际上是持久的。
有没有办法避免在执行查询之前加载持久引擎?