给出一个简单的投影像下面,NHibernate的将缓存查询计划,而不是更新变量的值时,查询是相同的:LINQ的投影正在NHibernate的不正确缓存3.2
int argValue = 1;
var result1 = database.Users.Select(x => new {x.Name, BadArg = argValue}).First();
argValue = 2;
var result2 = database.Users.Select(x => new {x.Name, BadArg = argValue}).First();
预期
RESULT1值将是名称= “鲍勃” 和BadArg = 1
RESULT2值将名称= “鲍勃” 和BadArg = 2
实际
RESULT1值将是NAME = “鲍勃” 和BadArg = 1
RESULT2值将是NAME = “鲍勃” 和BadArg = 1
显然,这会导致大量的疯狂的行为,如果你不期待它。我在NHibernate的bug跟踪中看到了类似于couple bug reports的couple bug reports,但自去年5月以来没有任何操作。所以要么没有人使用Linq到Nhibernate,要么有一些我不知道的解决方法。
在我深入研究NHibernate源代码之前,有没有办法禁用查询计划缓存来防止此行为或其他解决方法,或者是否有人从上述链接应用了修补程序?
注意
的例子是为了保持简单的问题,在现实中我有我想保持作为一个IQueryable一个复杂的推算,过早地转化为一个IEnumerable将无法正常工作。
更新 是否在github上掌握了NHibernate的3.2.1
我一直在寻找这个好奇心,它看起来像问题不是NHibernate的缓存本身,它是Linq表达式树缓存。问题是,表达式树被简化了,变量引用简化为一个常量表达式,之后缓存键被构造 - 但那时候并没有告诉范围变量ref和常量之间的区别。 : -/ – Rytmis 2012-01-15 19:13:04
我也一直有这个问题,这是一个浪费时间。每隔几个月它就会恢复原状,我已经忘记了它,只是为了再次发现它。在我的情况下,我不是投射到匿名对象,而是为我自己创作的对象赋值。 – 2012-06-01 19:04:36