首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从实体中撤回:db/ident

从实体中撤回:db/ident
EN

Stack Overflow用户
提问于 2017-07-10 11:15:25
回答 1查看 387关注 0票数 2

我有很多特殊的实体,但它们不是db模式的一部分。由于这些实体是特殊的,所以我为它们设置了一些:db/ident属性,以便在我的程序中方便地访问它们。

假设我现在将其中一个帐户称为:base-account,问题是当我使用实体api访问这些实体时,我遇到了这个问题:

代码语言:javascript
复制
;; access some entity that references one of the special entities
> (d/touch (d/entity db 12345678))
==> 
{:transaction/amount 22334455,
 :transaction/from {:db/id 0987654}, ;; normal reference to an entity
 :transaction/to :base-account} ;; this is a reference to a special account with a :db/ident attribute

这给我以前编写的一些代码带来了问题,因为这不会给我提供:transaction/to帐户的详细信息。

因此,为了解决这个问题,我从这些实体中删除了:db/ident属性:

代码语言:javascript
复制
> (d/transact connection [[:db/retract id-of-the-special-account
                           :db/ident :base-account]])

它成功地从实体中删除:db/ident

代码语言:javascript
复制
> (:db/ident (d/entity db id-of-the-special-account))
==> nil

但是由于某些原因(可能是一个bug),实体api调用仍然用它的旧标识引用它:

代码语言:javascript
复制
> (d/entity db :base-account) ;; should not work
==> {:db/id id-of-the-special-account}

那么,我如何才能从这些实体中删除标识,而不必将它们完全从数据库中删除呢?或者用一种正常的方式修复(d/entity ....)调用的工作方式?

编辑:我使用的是数据-pro-5544

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-17 21:35:12

来自数据体文档

and应该用于两个目的:命名架构实体和实现枚举标记。这两种用途都将在介绍性教程中演示。为了支持这些用法,身份证明有两个特殊的特点:

  • 标识符设计得非常快,而且总是可用的。与数据库相关联的所有标识符都存储在每个数据交换器和对等程序中的内存中。
  • 当您将实体API导航到具有ident的引用时,查找将返回ident,而不是其他实体。

最后一点可能会影响到你。

下一段:

这些特征还意味着不应使用身份证明文件的情况:

  • ids不应用作普通域实体上的唯一名称或ids。这样的实体名称应该使用一个特定于域的属性来实现,该属性是唯一的标识。
  • 不应将as用作测试数据的名称。(您的真实数据不会有这样的名称,您不希望测试数据的行为与它模拟的真实数据不同。)

这样看来,您可能希望重新设计DB,而不是尝试取消对:db/ident的使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45010596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档