我可以查询db4o以查找实现某些接口的所有对象吗?

时间:2011-06-02 11:54:48

标签: c# .net db4o

我遇到了db4o的问题,我想知道它是功能还是错误。

让我们看一些代码

        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 ,那么一切都会正常工作。这很奇怪,我找不到理由。

2 个答案:

答案 0 :(得分:1)

谢谢你们。但我们解决了这个谜题。问题是,db4o只在首次保存后才保存有关对象及其实现的接口的信息。

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

答案 1 :(得分:0)

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

要制作类似这样的工作,您可能需要构建自己的索引。存储对象时,对于层次结构中的每个类型(我希望ObjectIDisposable除外)更新new TypeIndex { IndexedType = typeof(IInterface), ActualKey = ... }之类的记录。