Db4o - обновить ВСЕ новые объекты в постоянном сеансе - PullRequest
2 голосов
/ 19 ноября 2011

возможно ли в Db4o загружать новые объекты в постоянный IObjectContainer?

У меня есть настольное приложение, которое при запуске открывает одно соединение (IObjectContainer). если я запросить все объекты с:

var objects = from DummyClass foo in session
              select foo

он отлично отбирает все объекты. Однако, если другой клиент добавляет новые классы после этого, тот же запрос все равно выбирает те же объекты без новых.

Я также знаю о:

session.Ext().Refresh(obj, int.MaxValue);

но у меня даже нет неактивированных ссылок на новые объекты, так что там. Как обновить новые объекты ?

Просто обратите внимание: я не хочу открывать / закрывать сессию каждый раз, когда мне нужны какие-то данные, я хочу использовать OODB (прозрачная активация, постоянство объектов с момента загрузки и т. Д.)

Спасибо

ОБНОВЛЕНИЕ (пример кода для лучшего понимания)

// store one class to fill database with some data
using (var mainSession = SessionFactory.CreateNewConnection())
{
    mainSession.Store(new DummyClass());
    mainSession.Commit();
}

using (var mainSession = SessionFactory.CreateNewConnection())
{
    // returns one object
    var objects = from DummyClass foo in session
                 select foo;
    using (var secondSession = SessionFactory.CreateNewConnection())
    {
        secondSession.Store(new DummyClass());
        secondSession.Commit();
    }

    // this loop reload objects known for mainSession (which is not new object)
    foreach (var obj in objects2)
    {
        mainSession.Ext().Refresh(obj, int.MaxValue);
    }

    // new DummyClass is commited but still not visible (Read-Commited isolation)
    // returns one object
    var objects2 = from DummyClass foo in session
                  select foo;
}

using (var mainSession = SessionFactory.CreateNewConnection())
{
    // returns two objects
    var objects = from DummyClass foo in session
                 select foo;
}

Мне нужно что-то вроде:

// refresh all objects of DummyClass
session.Ext().Refresh(typeof(DummyClass), int.MaxValue);

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Вы можете использовать Переданные события:

using Db4objects.Db4o;
using Db4objects.Db4o.Events;
using Db4objects.Db4o.IO;
using Db4objects.Db4o.Ext;

namespace PushedUpdates
{
    class Program
    {
        static void Main()
        {
            var config = Db4oEmbedded.NewConfiguration();
            config.File.Storage = new MemoryStorage();
            var container = Db4oEmbedded.OpenFile(config, "IN-MEMORY");

            var client = container.Ext().OpenSession();

            var clientEvents = EventRegistryFactory.ForObjectContainer(client);
            clientEvents.Committed += (s, a) =>
                                        {
                                            foreach(IObjectInfo added in a.Added)
                                            {
                                                System.Console.WriteLine(added.GetObject());
                                            }
                                        };

            container.Store(new Item { Value = 1 } );
            container.Commit();
            container.Store(new Item { Value = 2 });
            container.Commit();
            container.Store(new Item { Value = 3 });
            container.Commit();

            client.Close();
            container.Close();
        }
    }

    class Item
    {
        public int Value { get; set; }

        public override string ToString()
        {
            return "" + Value;
        }
    }
}
1 голос
/ 19 ноября 2011

Ваш клиент вызывал метод commit () после сохранения данных? В противном случае новые данные будут недоступны для других клиентов.

...