- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我面临一个关键的设计问题,即如何将自定义字段附加到我系统中的实体。这些实体在 C# 中表示并持久保存在 RavenDB 中。我们大致遵循领域驱动设计的租户,我们的实体是聚合根。
[注意:我想避免围绕 DDD 方法中自定义字段等通用功能的适当性进行任何争论。假设我们有合法用户需要将任意数据附加和显示到我们的实体。此外,我已将我的示例通用化以说明设计挑战。 :)]
我的问题是关于如何最好地布置字段定义和字段值实例。
想象一个域,我们在其中拥有 Book 和 Author 的聚合根。我们希望用户能够将任意数据属性附加到 Books 和 Authors 的实例。因此,我们可以使用这样的类定义一个自定义字段:
public enum CustomFieldType
{
Text,
Numeric,
DateTime,
SingleSelect,
MultiSelect
}
public class CustomFieldDefinition
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public CustomFieldType Type { get; set; }
public Collection<string> Options { get; set; }
}
附加到 Book 的 CustomFieldDefinition (CFD) 可能具有如下值:
我面临的第一个问题是在 Book 的每个实例上存储什么。选择范围从...
仅存储 CFD Id 和实例值
到
将整个差价合约连同值(value)一起存储
“低端”很糟糕,因为我无法在不引入 CFD 的情况下显示书籍,而 CFD 位于另一个文档中。此外,如果我以任何方式更改 CFD,我就会更改历史文档中值的含义。
“高端”不好,因为会有很多重复。 CFD 对于选择列表 CFD 来说可能非常繁重,因为定义包含所有可选择的选项。
第一个问题是……每本书的文档中应该存储多少?刚好足以显示这本书(而且我必须返回 CFD 来显示选项和说明(如果我要允许用户编辑 CF 值)?
第二个问题是……我应该将一种实体类型的整个 CFD 集合存储在一个文档中,还是将每个 CFD 保存在它自己的文档中?
作为文档的每个 CFD 使每个 CFD 的事情变得简单(尤其是当我开始做诸如停用定义之类的事情时),但是我需要一种方法来将书籍 CFD 与作者 CFD 分开。每当我想编辑实体时,这也迫使我为附加到实体的每个 CF 加载 1 个文档。
一个文档中给定类型的所有 CFD 允许我只加载一个文档,但随后我还要加载所有已停用的定义。
第三个问题...是否有更好的方法来实现这一点?
第四个问题...是否有任何示例或开源解决方案,这样我就不必重新发明这个轮子?
最佳答案
既然你在评论中说:
... a Book from a year ago should show the custom fields as of a year ago.
我只能看到两个可行的选择。
Nt:Tx
类型。您可以找到此关系类型的另一个示例 here .您可能想要了解 temporal relationships 的概览为了弄清楚这一点。请注意,这是一个棘手的主题,很快就会变得复杂。使用任一个选项,我会简单地在自定义字段定义上保留一个属性,说明它适用于什么类型(书籍、作者等)。
关于c# - 使用 C# 和 RavenDB 的自定义字段设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17623343/
我正在玩Raven DB几天,我想将其用作Web聊天应用程序的存储。我有包含一些用户数据和聊天记录的文档-这是大集合的聊天消息。 每次加载用户文档时,聊天记录也会加载,即使我只需要几个字段,例如:用户
我的实体是: class Resource { string Name; string EmployeeId; } 如何查询多名员工的资源?我尝试了这个: Resource[] Fin
我知道这篇文章的标题会让一些人感到畏缩。我自 2011 年 12 月以来一直在使用 RavenDB,并且逐渐意识到我以不适合使用文档数据库的方式对数据进行建模。首先,我完全明白这一点。其次,考虑到我目
考虑 2 个查询: var test1 = store.OpenSession().Query().Where(x => x.Id == 1).ToList(); var test2 =
我正在运行 RavenDB.Client 2.0.2173-Unstable。我正在创建一个 Multi-Tenancy 系统,作为我注册过程的一部分,我想创建一个新的 Raven 数据库。 我有三行
我正在使用在 Visual Studio 2010 中通过 NuGet 安装的嵌入式 RavenDB => RavenDB-Embedded.1.0.499 包。它正在我阅读完这篇优秀文章后开始的当前
我们在 AWS 上有一个带有集群 RavenDB 服务器 (5.23) 的 DotNet Core API (C#)。创建文档时,Id 具有不同的格式,具体取决于客户端。如果使用 Swagger/Po
我想知道取回搜索记录总数的最佳方法是什么,同时取回第 N 个 128 记录块数据段,这似乎是 RavenDb 运行时强加的上限。 例如给定这个查询,我还需要知道记录的总数。 var bookmarks
我使用的是 RavenDB 2.0.3.0 版。连接调试器后,涉及 RavenDB 的所有内容都运行得非常缓慢。每个查询需要几秒钟才能完成。 如果我在调试器坐在那里时按下暂停键,我总是看到它挂断了以下
我使用以下代码从 RavenDB 中删除文档。在 Raven UI 的底部,我可以看到文档数量从 3,000,000 减少到 2,000,000。但是“数据”文件的大小不会缩小。它总是大约100G。
我想在我的 Raven DB 中轮询新文档。推荐的方法是什么?我可以使用 IndexTimestamp 还是可以依赖文档的顺序? 我想我想分两步完成: 1.检查是否有新的东西,如果有: 1.1。获取最
我已经更改了我的数据模型,并且需要将所有对象的属性更改为 null,因为在我的模型更改后反序列化它们会引发异常。 我猜我可以为每个文档发布一个补丁,但我找不到任何方法来做到这一点,修补某种类型的每个文
有没有办法在进行空间搜索时从 RavenDB 获取距离计算值。我尝试转换建议的 _ = SpatialIndex.Generate(r.Latitude, r.Longitude) 至 距离 = Sp
是否有一种明智的方法来 stub /模拟调用 IDocumentSession.Query() 的结果? ? 我有一个命令,我想验证在对象上调用了方法(即正在测试的“单元”是命令,而不是命令编排的对象
我想在存储在 RavenDB 文档数据库中的两个实体之间有一个引用。由于这不是关系数据库,我知道我应该使用 RavenDBs 文档中描述的非规范化引用技术。虽然起初这看起来不错,但一旦我开始创建一个真
是否可以使用返回单个文档但不是关键的属性从数据存储加载(而不是查询)文档? 在我的场景中,我有用户和品牌。品牌是用户,但用户不一定是品牌。每个品牌都有一个 UserId 属性及其 Id。有没有办法通过
通过官方 RavenDB 阅读一个简单的问题 documentation ,我知道您可以使用客户端 API 函数执行这些操作,但不能使用 RQL,或者无论如何都可以使用 RQL 执行。 最佳答案 您正
我正尝试在 RavenDB 中检索我按 int 列表排序的文档。 Queryable = Queryable.OrderBy(dto => SearchIds.IndexOf(dto.Property
我刚刚让 RavenDB 开始工作。 我意识到我必须启动 RavenDB\packages\RavenDB.1.0.573\server.exe 才能通过以下方式在我的应用程序中访问它: Do
RavenDB 是否有众所周知的做法来检查 RavenDb 的可用性或检查它在任何给定时间的过载程度?我研究了一些 ravendb API 服务。好像没找到关于健康监测的。有没有像官方的 ravend
我是一名优秀的程序员,十分优秀!