EventStore投影链接后事件消失问题求助
问题原因
流名称大小写不匹配
EventStore的流名称是大小写敏感的。你初始创建的流是Quest-3(首字母大写),但投影代码里用的是"quest-" + event.data.questId(全小写),这会生成一个全新的quest-3流。你后续读取的是这个小写流,自然看不到原来Quest-3流里的quest-created事件——它其实还在原来的大写流里,只是你读错了流。投影监听的Category不匹配
你的投影用fromCategory('user')监听user类别下的事件,但创建quest-created事件时,是发到Quest-3流。EventStore默认按流名称的第一个-分割划分category,所以Quest-3属于Quest类别,根本不会被这个user类别的投影捕获,也就不会被link到目标流里。事件编号变化的本质
你看到的事件编号变化,是因为quest-3是新流,里面只有投影link过来的quest_started事件,它的事件编号从1开始计数,和原来Quest-3流的编号完全无关。
解决办法
1. 统一流名称大小写
把投影里的流名称前缀改成和创建时一致的大小写:
fromCategory('user') .when({ $init: function () { return { totalHealths: {} }; }, quest_started: function (state, event) { // 改为和创建时一致的"Quest-"前缀 linkTo("Quest-" + event.data.questId, event); }, });
或者在创建事件时统一用小写前缀,确保所有地方的流名称完全一致。
2. 调整投影监听范围(可选)
如果需要投影也处理quest-created事件,要么把创建事件的流名称改成user-Quest-3(让它属于user类别),要么把投影的监听范围改成fromAll()(监听所有流的事件),或者fromCategory('Quest')(监听Quest类别):
fromAll() .when({ $init: function () { return { totalHealths: {} }; }, quest_started: function (state, event) { linkTo("Quest-" + event.data.questId, event); }, quest_created: function (state, event) { // 把quest-created也link到对应流里 linkTo("Quest-" + event.data.questId, event); }, });
3. 验证读取流的代码
确保你读取事件时用的流名称和创建、投影里的完全一致,比如统一用Quest-3或者quest-3,不要混着用。
额外注意
投影里的expectedVersion参数在linkTo里是用来指定目标流的预期版本的,你用event.eventNumber是错误的——event.eventNumber是原事件在它所在流的编号,不是目标流的版本号。如果要避免并发问题,应该先读取目标流的当前版本再传入,或者用ExpectedVersion.Any。
内容的提问来源于stack exchange,提问作者maria

