我可以查询db4o中实现某个接口的所有对象吗
本文关键字:对象 接口 db4o 查询 实现 我可以 | 更新日期: 2023-09-27 17:58:09
我对db4o有问题,我想知道它是特性还是bug。
让我们看看一些代码
private interface IInterface {}
private class SimpleObject : IInterface
{}
[TestMethod, Ignore]
public void _()
{
var replicableServer = Db4oFactory.OpenServer(Path.GetFullPath(@"testdb"), 777);
try
{
replicableServer.GrantAccess("user", "user");
var client2 = Db4oFactory.OpenClient("127.0.0.1", 777, "user", "user");
var client1 = Db4oFactory.OpenClient("127.0.0.1", 777, "user", "user");
client1.Store(new SimpleObject());
client1.Commit();
var query = client2.Query();
query.Constrain(typeof(IInterface));
Assert.AreEqual(1, query.Execute().Count);
}
finally
{
replicableServer.Close();
}
}
在这里我们已经失败断言。但是,如果我们将约束中的类型更改为SimpleObject,一切都会正常工作。这很奇怪,我找不到理由。
谢谢大家。但我们解开了这个谜。问题是,db4o只在第一次保存之后才保存关于对象及其实现的接口的信息。
因此,在使用之前,我们简单地将所有空对象保存到base中。
我不知道db4o是如何工作的,但在编写了一个文档db之后,我可以说db4o不太可能存储整个类型层次结构。它将只跟踪用于存储数据的类型。在我的情况下,这实际上只是为了序列化。
要使这样的东西发挥作用,您可能需要建立自己的索引。存储对象时,对于层次结构中的每种类型(除了我期望的Object
和IDisposable
),都会更新类似new TypeIndex { IndexedType = typeof(IInterface), ActualKey = ... }
的记录。