NHibernate 克服 NotSupportedException

Posted

技术标签:

【中文标题】NHibernate 克服 NotSupportedException【英文标题】:NHibernate Overcoming NotSupportedException 【发布时间】:2012-06-18 09:12:44 【问题描述】:

有谁知道克服 NotSupportedException 的任何方法?我有一个针对用户的方法:

 public virtual bool IsAbove(User otherUser)
 
     return HeirarchyString.StartsWith(otherUser.HeirarchyString);
 

而我想做:

_session.Query<User>.Where(x => loggedInUser.IsAbove(x));

但这会引发 NotSupportedException。真正的痛苦是使用

_session.Query<User>.Where(x => loggedInUser.HeirarchyString.StartsWith(x.HeirarchyString));

工作得很好。但是,我不喜欢将其作为解决方案,因为这意味着如果我更改 IsAbove 方法的工作方式,我必须记住在我想要更新代码时复制代码的所有地方

【问题讨论】:

啊废话,当人们也不会拼写时,我总是第一个指出!多年来一定是弄错了:$ 【参考方案1】:

命名规范表达式并重复使用,例如:

public Expression<Func<....>> IsAboveSpecification = (...) => ...;

public virtual bool IsAbove(User otherUser)

    return IsAboveSpecification(HeirarchyString, otherUser.HeirarchyString);

根据需要在查询中重用 IsAboveSpecification。如果经常使用 IsAbove() 方法,可以在表达式上缓存 Compile() 方法的结果。

【讨论】:

我遇到了和 OP 一样的问题。无法使此解决方案起作用。首先,我希望能够调用对象,所以我不得不将初始化移到构造函数中,因为this 在成员初始化程序中不可用。更糟糕的是,我在尝试调用规范表达式时遇到错误:“预期的方法、委托或事件”。有什么建议吗? 尝试在表达式上调用 .Compile().Invoke()。它现在可以编译,但在从查询中调用函数“IsAbove”时会出现相同的异常。 无法从查询中调用表达式有几个原因:首先,当它被标记为公共时,NH 抱怨字段必须是受保护的或私有的。其次,当我尝试从外部查询调用它时,我得到了与上面相同的“方法、委托或事件预期”编译器错误。 您应该提出一个新问题并发布您尝试使用的代码。我不认为 N​​H 会抱怨某些事情是公开的 - 它确实坚持认为 virtual 修饰符存在。 感谢您的建议。目前有点继续前进,但我相信我们会回到这一点。当这再次变得相关时,我会问一个新问题(它会!)。

以上是关于NHibernate 克服 NotSupportedException的主要内容,如果未能解决你的问题,请参考以下文章

Nhibernate学习教程-- 第一个NHibernate程序

NHibernate教程(19) —— 一级缓存

Nhibernate学习教程-- 开篇有益

NHibernate 2 + NHibernate.JetDriver + MS Access:如何访问表的“附件”字段

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

ASP.NET MVC、NHibernate 会话和 NHibernate 事件