我正在尝试使用JSON序列化和在内存模式下运行的Sqlite对EventStore持久性进行单元测试。在EventStore初始化期间,我得到一个"没有这样的表:提交"异常。我假设这是因为EventStore以某种方式关闭了连接并打开了一个新的连接,导致它看到一个新的内存中的Sqlite实例(没有提交表)。有什么办法能解决这个问题吗?
SQLite的实现很有趣,特别是当您使用":memory:"连接字符串时。围绕实现的验收测试取决于数据库不会在操作之间"消失"。
EventStore的基本设计将每个离散的操作分离为一个单独的操作,其:
- 根据配置,在ambient TransactionScope(如果有的话)中列出
- 打开连接
- 构建idb命令
- 执行idb命令
- 评估结果
- 处置连接(将其释放回池)
- 完成TransactionScope(当没有抛出异常)
- 处置TransactionScope
你遇到的问题是,每次调用对EventStore打开和关闭连接。
现在,有一种方法可以解决这个问题,因为我想支持显式地利用相同的IDbConnection而不将其释放回池。EventStore v3.0(在候选发布阶段)有一个方法调用,它利用相同的连接,并避免在每次操作后断开连接:
ConfigurationConnectionFactory.OpenScope("SQLite"); // SQLite = app.config connection key
只需将其添加到"using_the_persistence_engine"验收测试类中,就可以完成所有设置了:
private static IDisposable scope;
添加以下内容作为"Establish context"的第一行:
scope = ConfigurationConnectionFactory.OpenScope("SQLite");
最后,"Cleanup everything"的最后一行应该是:
scope.Dispose();