Могу ли я запросить db4o для всех объектов, реализующих некоторый интерфейс? - PullRequest
0 голосов
/ 02 июня 2011

У меня проблема с 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 ]

1 голос
/ 14 августа 2011

Спасибо, ребята.Но мы решили эту загадку.Проблема заключалась в том, что db4o сохраняет информацию об объекте и интерфейсе, который он реализует, только после первого сохранения.

Итак, мы просто сохранили все наши пустые объекты в базу, прежде чем работать с ней.

0 голосов
/ 14 августа 2011

Я не знаю точно, как работает db4o, но, написав документ db, я могу сказать, что маловероятно, что db4o хранит всю иерархию типов.Он будет отслеживать только тот тип, который использовался для хранения данных.Это действительно только для сериализации в моем случае.

Чтобы сделать что-то подобное, вам, вероятно, потребуется создать собственный индекс.Когда объект сохраняется, для каждого типа в иерархии (за исключением ожидаемых Object и IDisposable) обновите запись, например new TypeIndex { IndexedType = typeof(IInterface), ActualKey = ... }.

...