问题标签 [marten]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
280 浏览

c# - Marten:在构造函数/工厂调用中定义模式内容(如索引等)以创建 DocumentStore

我刚开始测试Marten (2.9),到目前为止我很喜欢它。但是,我不确定我是否遵循该DocumentStore.For方法。例如,在 Marten 的“dbhandler”中,我可以这样写:

但很自然,当我初始化数据库并提供连接字符串时,我不想拥有所有的模式代码。

所以我想,也许我可以传递store变量,然后做同样的事情,但是For事情不存在:

在此处输入图像描述

...而且我还没有真正找到以任何其他方式设置架构的方法。

我真正想做的是有一个接口,当我启动我的应用程序时,它会动态加载和执行(通过反射),它可以处理这些事情,就像一个IMartenMetaData看起来像这样的接口:

然后在那个/那些类中实现模式的东西,但这不起作用,因为我不能使用 DocumentStore 来设置元。

0 投票
1 回答
108 浏览

c# - 在构造函数中调用 AddSubClassHierarchy() 导致查询中没有结果

当我阅读有关 Document Hierarchy 的 Maven 文档时,我认为调用通用参数是基类的 AddSubClassHierarchy() 会自动映射所有子类型。文档内容如下:

这对我来说听起来会使用反射,所以我不必指定每个子类。我的层次结构是CoreObject-->Actor-->Customer.

但是当我添加 AddSubClassHierarchy 时,Query<T>失败并且什么都不返回:

然后当我尝试时:

它失败并且不返回任何项目。所有其他Query<T>的也失败了,比如这个:

列表将包含 0 个元素。如果我删除_.Schema.For<CoreObject>().AddSubClassHierarchy();,我会从session.Query<Customer>().

编辑

我试着按照杰里米所说的去做;手动定义层次结构,如下所示:

起初,没有任何变化。我需要再次清除并插入对象。然后我意识到所有对象最终都在一个表中:mt_doc_coreobject

然后当我搜索时,它可以工作:

但我当然意识到将所有对象放在一个表中很容易解决,但我认为我阅读了许多其他警告,我不确定我是否正确解释:

类型层次结构有几件事需要注意:

  • 抽象或接口的文档类型自动假定为层次结构
  • 如果您想使用具体类型作为层次结构的基类,则需要通过添加子类来显式配置它,如上所示
  • 此时,您只能在顶部指定“可搜索”字段,基本类型
  • 子类文档类型必须可转换为顶级类型。目前,Marten 不支持“结构类型”,但将来可能
  • 在内部,子类类型文档也存储为身份映射机制中的父类型。
  • 添加此功能需要花费很多很多时间在我的桌子上敲打我的头。

最糟糕的部分似乎是“此时,您只能在顶部指定“可搜索”字段,基本类型”,但我Query<>在用户名上做了一个,它在基本类型中不存在CoreObject(它存在于Actor)。所以我不确定这意味着什么?

更新

Marten 必须用“可搜索”表示“可索引”是什么意思?因为我不能再在子类中存在的属性上创建索引,看来。

0 投票
1 回答
894 浏览

c# - 如何确定在 Docker 容器中运行的 PostgreSQL 是否已使用 Marten 完成初始化?

我基本上正在编写一些程序来对PostgreSQL给定表增长的插入性能进行基准测试,并且我想确保当我使用 Marten 插入数据时,数据库已完全准备好接受插入。

我正在使用 Docker.DotNet 生成一个运行最新PostgreSQL映像的新容器,但即使容器处于某种running状态,有时在该容器内运行的 Postgre 也并非如此。

当然,我可以添加一个Thread. Sleep,但这有点随机,所以我宁愿用确定性的方法来确定数据库何时准备好接受插入?

仅供参考,如果我正在运行上面的程序而没有在await session.SaveChangesAsync();我正在运行的行之前暂停而不是进入以下异常:

[编辑]

我接受了一个答案,但由于Docker.DotNet我无法利用答案中给出的解决方案(我仍然认为在.NET 客户端中正确翻译该 docker 命令,如果实际上可能的话)中关于健康参数等效的错误)将是最佳解决方案。与此同时,这就是我解决问题的方法,我基本上轮询预期在运行状况检查中运行的命令,直到结果正常:

Program.cs,代码的实际内容:

扩展定义在ContainerOperationsExtensions.cs

Docker.cs获取本地 docker api uri:

0 投票
2 回答
91 浏览

casting - F#:将 seq<'A> 转换为 seq<'B> 的最快方法

我将 Marten 用作事件存储,特别是用于获取事件流。

stream被定义为IReadOnlyList<IEvent>IEvent

如果属性的基础类型是(如果不是,则项目不会在结果序列中产生) ,我想将每个转换IEvent为。AccountEventsDataAccountEvents

在 C# 中,我会简单地使用关键字as来实现这一点,但在 F# 中,我不确定最快的 F#-ish 方式(就性能而言)是什么。

我最终得到了以下代码:

但这似乎相当“昂贵”,我想知道转换.DataOption<AccountEvents>+ 过滤器的步骤是否IsSome可以一次完成。

0 投票
0 回答
238 浏览

c# - F#:Marten 不加载聚合

我正在将 C# 中的 Marten 示例改编为 F#,但奇怪的是无法真正获得我的聚合的正确值:

问题是当请求具有相关id的聚合对应的文档时,它只是返回null

奇怪地获取事件流按预期返回事件:

就像投影从未构建或存储,因此从未调用Account聚合Apply方法。

资料来源:Marten - 预测


[编辑]

事实证明,如果我不使用受歧视的工会,而是直接使用不同案例的类型,它会起作用:


[编辑] 我在 GitHub 上打开了一个问题:https ://github.com/JasperFx/marten/issues/1283

0 投票
1 回答
45 浏览

linq - 无法使用 marten 和 Linq 查询子类型

我是 Marten 的新手,对于应该简单的查询感到非常困难。我有一个具有 EmailAddress 类型属性的 Person 类。我想找到任何具有特定电子邮件地址的人。

我创建了一个连接到 PostgreSQl 的测试类,并且能够使用 Marten 插入类型。序列化程序运行良好,能够使用它们的非公共设置器对这些类型进行序列化和反序列化。但是任何与 Person 类型的 Emails 属性相关的查询都会失败。

0 投票
1 回答
66 浏览

marten - 使用 ASP.Net Core 连接到 2 个不同的 MartenDB 数据存储

在 ASP.Net Core 中设置 MartenDB 数据存储时,通常将这样的代码放在 Startup.cs 中:

这允许您随后将 IDocumentSession 和 IDocumentStore 注入到您的各种类中以使用该数据库。

现在,如果您必须连接到第二个数据库,您会怎么做?我查看了ISessionFactory,但您可以从此处更改连接字符串并不明显。您是否需要手动创建和注册新的 DocumentStore?

0 投票
2 回答
61 浏览

c# - 如何从 Marten 构建的事件存储中获取特定类型的聚合集合?

我是事件溯源的新手,我正在尝试在我的简短应用程序中将事件存储实现为写入模型。我有一个包含以下代码的用户聚合:

在我创建一个新用户之前,我需要检查,是否已经登录。我知道如何重建具有特定 id 的聚合(我在这种情况下使用 AggregateStreamAsync 方法),但是这次我需要在注册新用户之前检查所有聚合的登录。如何实现这样的逻辑?感谢您的任何回答。

0 投票
1 回答
131 浏览

c# - 如何在应用程序启动时使用 Marten 创建数据库?

如果数据库不存在,我希望 Marten 在配置我的事件存储时创建它。我在文档中发现我需要使用以下代码片段来实现这种行为:

文档说“如果连接尝试导致无效的目录错误 (3D000),则会触发数据库创建。”。附加的代码确实导致了上述错误(3D000),但我没有触发数据库创建,而是得到以下未处理的异常:“Npgsql.PostgresException(0x80004005):3D000:数据库“UserDatabase1”不存在于 Npgsql.NpgsqlConnector” . 连接字符串中使用的用户的权限是正确的。如果数据库不存在,如何使用 Marten 创建数据库?我究竟做错了什么?

0 投票
1 回答
140 浏览

c# - Marten OpenSession() 与 LightweightSession()

我是新来的。vs 和
有什么不一样?IDocumentStore.OpenSession()IDocumentStore.LightweightSession()