【问题标题】:NHibernate Component mapping (Creating Criteria)NHibernate 组件映射(创建标准)
【发布时间】:2011-06-15 05:43:43
【问题描述】:

有没有办法为组件创建“别名”?
我有一个“Criteria Builder”,它采用“Address.City”(或“User.Address.City”,...)格式的字符串,并基于它创建一个 ICriteria(过滤器和排序)。
我正在使用组件来映射“地址”类,因此它与“用户”保持在同一个表中。

我得到的例外是:
NHibernate.QueryException 无法解析属性:城市:MyNamespace.User

如果我尝试不为地址组件创建“别名”,它就可以正常工作。
但是,由于它是一个标准构建器,有没有办法检测“地址”是一个组件并避免调用条件。CreateAlias(“地址”)?有什么解决办法吗?

This 与我的问题相同,但该解决方案对我来说不可行(我不会为每个查询手动创建条件)。

任何帮助将不胜感激!

【问题讨论】:

  • 你能发布一些你的代码吗?
  • @Yads - 我现在实际上没有代码。它应该像通过属性引用“地址”类的“用户”类一样简单。在用户的映射中,我将“地址”作为一个组件。请查看forum.hibernate.org/…,因为它与我的问题非常相似。谢谢!

标签: nhibernate fluent-nhibernate components mapping


【解决方案1】:

您无法为地址创建别名,因为地址不是映射实体。 CreateAliasCreateCriteria 之间的唯一区别是前者返回原始 Criteria,而后者返回新的 Subcriteria。因此,您可以为其创建标准的唯一类是已映射的类。由于组件不是映射类,因此您无法围绕它们创建标准。

我唯一的建议是让您的 Address 类实现一个空的描述符接口,如 IComponent 或使用自定义 ComponentAttribute 标记它。然后您的 CriteriaBuilder 可以检查它为其创建标准的类是否具有此元数据并忽略它。

【讨论】:

  • 我认为使用反射来检查属性太昂贵(我的起点是字符串“Address.City”)。除非你有别的想法?在这种情况下,“空描述符”有什么帮助?你能发布一些代码吗?我所需要的只是 CreateAlias 足够聪明并检测该类是否是组件,或者可以告诉我的方法... =/感谢您的帮助!
  • @Frederico,如果没有看到你的代码,我不能完全确定你的 CriteraiBuilder 是如何工作的。也许您可以像if (objToMap is IComponent) //do not call CreateAlias 一样进行检查
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 2015-03-15
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
相关资源
最近更新 更多