NHibernate Validator 升级到 3.1 后抛出 System.NotSupportedException

发布于 2024-12-14 04:35:31 字数 3047 浏览 3 评论 0原文

有人遇到过这种情况吗?

升级到 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

征棹 2024-12-21 04:35:31

NHibernate 3.2 不再需要外部代理库。

它们仍然受支持,但不再分发,默认情况下是使用内部实现。

您尝试过升级吗?


更新:为了编译NH 3.2的NHibernate Validator,您需要修改NHibernateHelper如下:

public static bool IsProxyFactoryConfigurated()
{
    var f = NHibernate.Cfg.Environment.BytecodeProvider.ProxyFactoryFactory;
    return f != null;
}

有关详细信息,请阅读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:

public static bool IsProxyFactoryConfigurated()
{
    var f = NHibernate.Cfg.Environment.BytecodeProvider.ProxyFactoryFactory;
    return f != null;
}

For details, read NHV-116

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文