问题标签 [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.
c# - Marten:在构造函数/工厂调用中定义模式内容(如索引等)以创建 DocumentStore
我刚开始测试Marten (2.9),到目前为止我很喜欢它。但是,我不确定我是否遵循该DocumentStore.For方法。例如,在 Marten 的“dbhandler”中,我可以这样写:
但很自然,当我初始化数据库并提供连接字符串时,我不想拥有所有的模式代码。
所以我想,也许我可以传递store变量,然后做同样的事情,但是For事情不存在:
...而且我还没有真正找到以任何其他方式设置架构的方法。
我真正想做的是有一个接口,当我启动我的应用程序时,它会动态加载和执行(通过反射),它可以处理这些事情,就像一个IMartenMetaData看起来像这样的接口:
然后在那个/那些类中实现模式的东西,但这不起作用,因为我不能使用 DocumentStore 来设置元。
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 必须用“可搜索”表示“可索引”是什么意思?因为我不能再在子类中存在的属性上创建索引,看来。
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:
casting - F#:将 seq<'A> 转换为 seq<'B> 的最快方法
我将 Marten 用作事件存储,特别是用于获取事件流。
stream被定义为IReadOnlyList<IEvent>:IEvent
如果属性的基础类型是(如果不是,则项目不会在结果序列中产生) ,我想将每个转换IEvent为。AccountEventsDataAccountEvents
在 C# 中,我会简单地使用关键字as来实现这一点,但在 F# 中,我不确定最快的 F#-ish 方式(就性能而言)是什么。
我最终得到了以下代码:
但这似乎相当“昂贵”,我想知道转换.Data为Option<AccountEvents>+ 过滤器的步骤是否IsSome可以一次完成。
c# - F#:Marten 不加载聚合
我正在将 C# 中的 Marten 示例改编为 F#,但奇怪的是无法真正获得我的聚合的正确值:
问题是当请求具有相关id的聚合对应的文档时,它只是返回null
奇怪地获取事件流按预期返回事件:
就像投影从未构建或存储,因此从未调用Account聚合Apply方法。
资料来源:Marten - 预测
[编辑]
事实证明,如果我不使用受歧视的工会,而是直接使用不同案例的类型,它会起作用:
[编辑] 我在 GitHub 上打开了一个问题:https ://github.com/JasperFx/marten/issues/1283
linq - 无法使用 marten 和 Linq 查询子类型
我是 Marten 的新手,对于应该简单的查询感到非常困难。我有一个具有 EmailAddress 类型属性的 Person 类。我想找到任何具有特定电子邮件地址的人。
我创建了一个连接到 PostgreSQl 的测试类,并且能够使用 Marten 插入类型。序列化程序运行良好,能够使用它们的非公共设置器对这些类型进行序列化和反序列化。但是任何与 Person 类型的 Emails 属性相关的查询都会失败。
marten - 使用 ASP.Net Core 连接到 2 个不同的 MartenDB 数据存储
在 ASP.Net Core 中设置 MartenDB 数据存储时,通常将这样的代码放在 Startup.cs 中:
这允许您随后将 IDocumentSession 和 IDocumentStore 注入到您的各种类中以使用该数据库。
现在,如果您必须连接到第二个数据库,您会怎么做?我查看了ISessionFactory,但您可以从此处更改连接字符串并不明显。您是否需要手动创建和注册新的 DocumentStore?
c# - 如何从 Marten 构建的事件存储中获取特定类型的聚合集合?
我是事件溯源的新手,我正在尝试在我的简短应用程序中将事件存储实现为写入模型。我有一个包含以下代码的用户聚合:
在我创建一个新用户之前,我需要检查,是否已经登录。我知道如何重建具有特定 id 的聚合(我在这种情况下使用 AggregateStreamAsync 方法),但是这次我需要在注册新用户之前检查所有聚合的登录。如何实现这样的逻辑?感谢您的任何回答。
c# - 如何在应用程序启动时使用 Marten 创建数据库?
如果数据库不存在,我希望 Marten 在配置我的事件存储时创建它。我在文档中发现我需要使用以下代码片段来实现这种行为:
文档说“如果连接尝试导致无效的目录错误 (3D000),则会触发数据库创建。”。附加的代码确实导致了上述错误(3D000),但我没有触发数据库创建,而是得到以下未处理的异常:“Npgsql.PostgresException(0x80004005):3D000:数据库“UserDatabase1”不存在于 Npgsql.NpgsqlConnector” . 连接字符串中使用的用户的权限是正确的。如果数据库不存在,如何使用 Marten 创建数据库?我究竟做错了什么?
c# - Marten OpenSession() 与 LightweightSession()
我是新来的貂。vs 和
有什么不一样?IDocumentStore.OpenSession()IDocumentStore.LightweightSession()
