【问题标题】:RavenDB polymorphic IndexRavenDB 多态索引
【发布时间】:2013-08-15 04:35:43
【问题描述】:

我正在使用 RavenDB,并且正在尝试做一些事情。我有一个基本类型 Principal,它派生了两个类:User 和 ApplicationInstance。在我的应用程序中,必须经常创建和存储 User 和 ApplicationInstance 的实例。但问题是,我还需要能够一次查询存储在数据库中的所有 Principal 对象,确定给定的 Principal 是 User 还是 ApplicationInstance,然后查询整个 User 或 ApplicationInstance 对象。

我该怎么做?

【问题讨论】:

标签: c# database ravendb


【解决方案1】:

您可以定义一个Multi Map Index,将UserApplicationInstance 集合用作源。

如果您使用 C# 代码定义索引(通过实现 AbstractMultiMapIndexCreationTask<>),则必须调用 AddMap 两次才能实现(如上面的博客文章链接所示)

如果您使用 Raven Studio 定义索引,只需单击 添加地图 按钮,您将获得一个新的文本区域,允许您定义额外的地图。

但是请注意,两个映射的输出结构必须具有相同的属性(几乎就像您在 SQL 中使用 UNION 所做的那样)。

【讨论】:

  • Multimap 是这里的必经之路。您甚至可以使用转换结果将原理加载到结果文档的属性中,以便在服务器上保留更多内容。
【解决方案2】:

你想做什么?如果最终的结果是查询所有的Principals,然后加载整个User或者AppInstance,为什么不直接查询所有Users或者所有的AppInstances呢?

Raven 不会存储基类;它只会存储最派生的类型(在您的情况下为用户或 AppInstance)。因此,您将拥有一组用户和一组 AppInstance。

如果你真的需要同时查询两个,你可以使用Multi Map indexes。您还可以更改实体名称并将两者存储在单个 Principal 集合中。

但是,如果不知道您要做什么,就很难推荐解决方案。 解释你想要做什么,我们会告诉你到达那里的正确方法。

【讨论】:

  • 好吧,我正在尝试管理对资源的访问。存储在数据库中的许多文档都包含一种 ACL,该 ACL 对应于 Principal 对象(它们的 Id)和所述主体拥有的权限(例如,读、写、删除、更改所有权)。我试图给定 ACL 中的 Principal 的 Id,查询一般的主体对象或特定的 AppInstance 或用户。这就是我的意思:Principal p = session.Load<Principal>(id); if (p is AppInstance) { ... } elseif (p is User) { ... } 还是我的想法有误?
  • .Load(id) 时会发生什么?你拿什么回来?我希望 Raven 会返回正确的对象,无论您作为类型参数发送什么。
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
相关资源
最近更新 更多