RavenDB 不使用时不允许删除

Posted

技术标签:

【中文标题】RavenDB 不使用时不允许删除【英文标题】:RavenDB Disallow Delete if Not in Use 【发布时间】:2012-02-12 22:07:53 【问题描述】:

我刚刚让一个用户删除了我的 Raven DB 中的两个文档。这导致了问题,因为这些文件被其他文件引用。我知道 Raven 有一个用于级联删除的捆绑包,但我更多的是寻找一种方法来禁止删除,如果它被另一个文档引用。是否有标准的 RavenDB 方式来执行此操作?还是我需要遍历所有文档以检查该文档是否被引用?

【问题讨论】:

【参考方案1】:

Bob,很遗憾,没有标准的方法可以做到这一点,因为数据库本身不知道文档之间的关系是什么。

因此,如果您想阻止用户删除这些文档,那么可以,您必须检查自己是否有任何其他文档引用当前文档。

【讨论】:

谢谢,丹尼尔。您知道我是否必须针对我拥有的每种文档类型进行许多单独的查询吗?或者是否有一个查询可以返回我要删除的文档的任何实例? 对不起,我不明白这个问题。你能解释一下吗? 是否可以one查询某个文档ID是否存在多次?如果有多个,那么我知道它被另一个文档引用。否则,我将不得不为每种文档类型执行单独的查询 (Query),以查看它们是否引用了我要删除的文档。【参考方案2】:

正如 Daniel 所说,RavenDB 不知道文档之间的关联,因此它不能开箱即用。

但是,您可以实现自己的包并使用delete trigger 功能来否决/允许删除成功。

如果你想走这条路,看看Cascading Delete bundle 是如何实现的。你只需要做相反的事情。

【讨论】:

噢噢噢……这可能是一个有趣的改进机会。我得检查一下。谢谢! 删除触发链接已损坏。你有更好的吗? 我认为这样做的主要部分是找到所有引用要删除的文档的文档。事实上,如果 any 文档引用了要删除的文档,那么我想抛出一个异常。在您提供的链接中,看起来引用的文档是这样找到的: var documentsToDelete = document.Metadata.Value(MetadataKeys.DocumentsToCascadeDelete);这对你有意义吗?我在我的代码中试过了,结果为空。

以上是关于RavenDB 不使用时不允许删除的主要内容,如果未能解决你的问题,请参考以下文章

如何在共享主机环境中运行 RavenDB?

RavenDB 会话 > 30

在 RavenDB 中指定集合名称

RavenDb:在单元测试时强制索引等到不陈旧

RavenDB 使用 Raven.Smuggler 在 RavenDB 服务器之间导出/导入数据

#yyds干货盘点#RavenDB起步--客户端API