gpt4 book ai didi

c# - NHibernate QueryException : Type mismatch, 预期类型 == 实际类型

转载 作者:行者123 更新时间:2023-11-30 18:09:58 27 4
gpt4 key购买 nike

当使用 ActiveRecord 2.0 和 NHibernate 2.1.0(也尝试过 2.1.2)时,我们在 Web 应用程序中遇到了这个非常奇怪的问题。如果这个描述有点含糊,我很抱歉,但我们在理解到底发生了什么时遇到了问题。我们正在开发一个大型企业应用程序,我们正在尝试隔离问题并制作一个小示例,但我们还没有完成。

当我们尝试对具有多对一关系的两个对象执行特殊查询时,就会出现问题。这是会导致问题的代码:

int testItemId = 1;
TestItem testItem = ActiveRecordMediator<TestItem>.FindByPrimaryKey(testItemId, false);
DetachedCriteria testCriteria = DetachedCriteria.For<TestItemRevision>();
testCriteria.Add(Expression.Eq("TestItem", testItem));
TestItemRevision testRevision = ActiveRecordMediator<TestItemRevision>.FindFirst(testCriteria);

执行 FindFirst(或 FindAll)时抛出以下异常:NHibernate.Criterion.SimpleExpression 中的类型不匹配:TestItem 预期类型 MyProduct.Core.DomainModel.Test.TestItem,实际类型 MyProduct.Core.DomainModel.Test.TestItem

如您所见,预期类型 == 实际类型。

我们发现这个异常是在 NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(...) 中抛出的。我们已经编译了我们自己的 NHibernate 版本,并在此处进行了一些额外的登录。当一切正常时,我们得到这个:

propertyType.ReturnedClass.Assembly: MyProduct.Core.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
propertyType.ReturnedClass.Assembly.Location: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\daa38103\4727b73f\assembly\dl3\bb8c85b9\7202540f_a593ca01\MyProduct.Core.DomainModel.DLL
value.GetType().Assembly: MyProduct.Core.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
value.GetType().Assembly.Location: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\daa38103\4727b73f\assembly\dl3\bb8c85b9\7202540f_a593ca01\MyProduct.Core.DomainModel.DLL

当抛出异常时,我们得到:

propertyType.ReturnedClass.Assembly: MyProduct.Core.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
propertyType.ReturnedClass.Assembly.Location == String.Empty: True
value.GetType().Assembly: MyProduct.Core.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
value.GetType().Assembly.Location: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\daa38103\4727b73f\assembly\dl3\bb8c85b9\7202540f_a593ca01\MyProduct.Core.DomainModel.DLL

即当抛出异常时,期望的类型没有Location,被当作不同的程序集处理。

真正奇怪的是:并不总是抛出异常。我们必须回收 IIS 中的应用程序池以重现该问题,并且只有大约 3 次重新启动中的 1 次会真正触发它。我们认为这个查询一定是重启后发生的第一件事,但我们不确定这一点。抛出一次异常后,直到App Pool被回收,或者bin文件夹中的DLL被更新后,查询才会再次进行。重新启动网站或更改 Web.config 没有帮助。我们已经在 WinServer 2003/IIS6 和 Win7/IIS7.5 上重现了这个问题。

我们已尝试使用完全相同的对象映射和完全相同的查询来设置测试项目,但我们还无法在大型应用程序之外重现该问题。有没有人知道什么可能导致这样的事情?

编辑:

这是我们在 global.asax Application_Start 中加载程序集的方式:

Assembly[] assemblies = new[] { Assembly.Load("MyProduct.Core.DomainModel") };
ActiveRecordStarter.Initialize(assemblies, ActiveRecordSectionHandler.Instance);

(这是一个简化版本,我们实际上是从配置中加载我们的程序集名称,但它与这个问题无关。)

最佳答案

MSDN says that, for the Assembly Location property,

If the assembly is loaded from a byte array, such as when using the Load(array[]) method overload, the value returned is an empty string ("").

也就是说,不是从磁盘上的文件位置加载程序集,而是有人读入一个字节数组并以这种方式加载它。 google-tubes 告诉我这会导致程序集加载 a different security context ,因此,NHibernate 将其视为不同的类型也就不足为奇了。

是否有可能您有某种机制可以以这种方式加载程序集,可能是在某种竞争条件下?我会尝试从这里进入兔子洞。祝你好运!

关于c# - NHibernate QueryException : Type mismatch, 预期类型 == 实际类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2060819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com