NHibernate Validator 升级到 3.1 后抛出 System.NotSupportedException
有人遇到过这种情况吗?
升级到 NHibernate 3.1 后,在运行 NUnit 测试用例时,我从 NHibernate Validator 收到以下异常:
System.NotSupportedException:不支持调用的成员 动态装配。在 System.Reflection.Emit.InternalAssemblyBuilder.GetManifestResourceStream(字符串 姓名)在 NHibernate.Validator.Cfg.XmlMappingLoader.AddResource(程序集 程序集,字符串资源)位于 NHibernate.Validator.Cfg.XmlMappingLoader.GetXmlMappingFor(类型类型) 在 NHibernate.Validator.Engine.JITClassMappingFactory.GetExternalDefinitionFor(类型 类型)在 NHibernate.Validator.Engine.JITClassMappingFactory.GetClassMapping(类型 clazz,ValidatorMode 模式)位于 NHibernate.Validator.Engine.ClassValidator.InitValidator(类型 clazz, IDictionary`2 嵌套类验证器)位于 NHibernate.Validator.Engine.ClassValidator..ctor(类型 clazz, IConstraintValidatorFactory 约束ValidatorFactory,IDictionary`2 childClassValidators、IClassValidatorFactory 工厂)位于 NHibernate.Validator.Engine.StateFullClassValidatorFactory.GetRootValidator(类型 类型)在 NHibernate.Validator.Engine.ValidatorEngine.GetClassValidator(类型 实体类型)位于 NHibernate.Validator.Engine.ValidatorEngine.GetElementOrNew(类型 实体类型)位于 NHibernate.Validator.Engine.ValidatorEngine.InternalValidate(对象 实体,Object[] activeTags)位于 NHibernate.Validator.Engine.ValidatorEngine.Validate(对象实体, 对象[] activeTags)位于 NHibernate.Validator.Event.ValidateEventListener.Validate(对象 实体,EntityMode 模式)位于 NHibernate.Validator.Event.ValidatePreUpdateEventListener.OnPreUpdate(PreUpdateEvent 事件)在 NHibernate.Action.EntityUpdateAction.PreUpdate() 中 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityUpdateAction.cs: NHibernate.Action.EntityUpdateAction.Execute() 中的第 200 行 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityUpdateAction.cs: NHibernate.Engine.ActionQueue.Execute(IExecutable) 第 58 行 可执行文件)中 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:行 136 at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) 中 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:行 126 在 NHibernate.Engine.ActionQueue.ExecuteActions() 中 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:行 170 于 NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource 会话)中 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs: 第 241 行 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent 事件)中 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs: NHibernate.Impl.SessionImpl.Flush() 中的第 19 行 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:行 分段阅读_第 1472 章
正如您从堆栈跟踪中看到的那样,当刷新会话并且 NHibernate Validator 执行其操作时,会发生错误。
更新 我尝试单步执行 NH Validator 代码,似乎在某些时候它正在尝试验证实体的 Castle 代理,而不是底层实体本身。这就会导致麻烦。不知道该怎么办...
更新 如果我使用 LinFu ProxyFactoryFactory 而不是 Castle,问题就会消失。不幸的是,LinFu 给了我 其他问题 所以我不想使用它。
Has anyone encountered this?
After upgrading to NHibernate 3.1, I am receiving the following exception from NHibernate Validator when running NUnit test cases:
System.NotSupportedException : The invoked member is not supported in
a dynamic assembly. at
System.Reflection.Emit.InternalAssemblyBuilder.GetManifestResourceStream(String
name) at
NHibernate.Validator.Cfg.XmlMappingLoader.AddResource(Assembly
assembly, String resource) at
NHibernate.Validator.Cfg.XmlMappingLoader.GetXmlMappingFor(Type type)
at
NHibernate.Validator.Engine.JITClassMappingFactory.GetExternalDefinitionFor(Type
type) at
NHibernate.Validator.Engine.JITClassMappingFactory.GetClassMapping(Type
clazz, ValidatorMode mode) at
NHibernate.Validator.Engine.ClassValidator.InitValidator(Type clazz,
IDictionary`2 nestedClassValidators) at
NHibernate.Validator.Engine.ClassValidator..ctor(Type clazz,
IConstraintValidatorFactory constraintValidatorFactory, IDictionary`2
childClassValidators, IClassValidatorFactory factory) at
NHibernate.Validator.Engine.StateFullClassValidatorFactory.GetRootValidator(Type
type) at
NHibernate.Validator.Engine.ValidatorEngine.GetClassValidator(Type
entityType) at
NHibernate.Validator.Engine.ValidatorEngine.GetElementOrNew(Type
entityType) at
NHibernate.Validator.Engine.ValidatorEngine.InternalValidate(Object
entity, Object[] activeTags) at
NHibernate.Validator.Engine.ValidatorEngine.Validate(Object entity,
Object[] activeTags) at
NHibernate.Validator.Event.ValidateEventListener.Validate(Object
entity, EntityMode mode) at
NHibernate.Validator.Event.ValidatePreUpdateEventListener.OnPreUpdate(PreUpdateEvent
event) at NHibernate.Action.EntityUpdateAction.PreUpdate() in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityUpdateAction.cs:
line 200 at NHibernate.Action.EntityUpdateAction.Execute() in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityUpdateAction.cs:
line 58 at NHibernate.Engine.ActionQueue.Execute(IExecutable
executable) in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs: line
136 at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs: line
126 at NHibernate.Engine.ActionQueue.ExecuteActions() in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs: line
170 at
NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource
session) in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:
line 241 at
NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent
event) in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:
line 19 at NHibernate.Impl.SessionImpl.Flush() in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs: line
1472 at TestDataAccess.FooTest.TestFoo() in FooTest.cs
As you can see from the stack trace, the error occurs when the session is flushed and NHibernate Validator does its thing.
Update I have tried stepping through the NH Validator code and it appears that at some point it is trying to validate the Castle proxy of an entity, rather than the underlying entity itself. This then causes the trouble. No idea what to do about this...
Update The problem goes away if I use the LinFu ProxyFactoryFactory, rather than Castle. Unfortunately, LinFu is giving me other problems so I don't want to use it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
NHibernate 3.2 不再需要外部代理库。
它们仍然受支持,但不再分发,默认情况下是使用内部实现。
您尝试过升级吗?
更新:为了编译NH 3.2的NHibernate Validator,您需要修改
NHibernateHelper
如下:有关详细信息,请阅读NHV-116
NHibernate 3.2 removed the need for external proxy libraries.
They are still supported, but they are not distributed anymore, and the default is to use an internal implementation.
Have you tried upgrading?
Update: in order to compile NHibernate Validator for NH 3.2, you need to modify
NHibernateHelper
as follows:For details, read NHV-116