我有一堆特殊的实体,但它们不是数据库模式的一部分。由于这些实体很特殊,我为它们设置了一些:db/ident
属性,以便在我的程序中轻松访问它们。
让我说我打电话给其中一个帐户:base-account
现在的问题是,当我使用实体api访问这些实体时,我遇到了这个问题:
;; 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
属性:
> (d/transact connection [[:db/retract id-of-the-special-account
:db/ident :base-account]])
成功从实体中删除了:db/ident
:
> (:db/ident (d/entity db id-of-the-special-account))
==> nil
但由于某种原因(可能是一个错误),实体api调用仍然用它的旧身份引用它:
> (d/entity db :base-account) ;; should not work
==> {:db/id id-of-the-special-account}
那么如何从这些实体中删除标识而不必将它们从数据库中删除呢?或者也许是一种以理智的方式修复(d/entity ....)
调用方式的方法?
答案 0 :(得分:1)
Idents应该用于两个目的:命名模式实体和 实现枚举标签。这两种用途都在中国得到了证明 入门教程。为了支持这些用法,idends有两个 特色:
- Idents的设计非常快,始终可用。与数据库关联的所有标识都存储在每个标识符的内存中 Datomic transactor and peer。
- 当您将实体API导航到具有ident的引用时,查找将返回ident,而不是其他实体。
最后一个要点可能会影响到你。
下一段:
这些特征也意味着同意不应该出现的情况 使用:
- 不应将Idents用作普通域实体的唯一名称或ID。这样的实体名称应该用a来实现 特定于域的属性,它是唯一的标识。
- 不应将Ident用作测试数据的名称。 (您的真实数据不会有这样的名称,并且您不希望测试数据表现出来 与它模拟的真实数据不同。)
从这看起来您似乎可能想要重新设计数据库,而不是试图取消对:db/ident
的使用。