我可以查询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中实现某个接口的所有对象吗

谢谢大家。但我们解开了这个谜。问题是,db4o只在第一次保存之后才保存关于对象及其实现的接口的信息。

因此,在使用之前,我们简单地将所有空对象保存到base中。

我不知道db4o是如何工作的,但在编写了一个文档db之后,我可以说db4o不太可能存储整个类型层次结构。它将只跟踪用于存储数据的类型。在我的情况下,这实际上只是为了序列化。

要使这样的东西发挥作用,您可能需要建立自己的索引。存储对象时,对于层次结构中的每种类型(除了我期望的ObjectIDisposable),都会更新类似new TypeIndex { IndexedType = typeof(IInterface), ActualKey = ... }的记录。