Приложение NHibernate для настольных компьютеров - презентация - не загружать последние данные из базы данных - PullRequest
1 голос
/ 07 сентября 2010

Я пишу WPF NHibernate Desktop App, используя Session Per Presenter. У меня есть представление списка, в котором показаны все сохраненные SalesOrders и форма Изменить заказ на продажу, когда вы дважды щелкнете на Заказ на продажу.

Каждая из этих форм имеет объект сеанса, который длится в течение всей жизни формы. Когда SalesOrder сохранен, он публикует Событие, которое заставляет представление списка перезагрузиться. EditForm определенно сохраняет в базе данных, а ListView определенно выбирает из базы данных. Однако сеанс, который принадлежит ListViewPresenter, не обновляет свои объекты теми, которые извлечены из базы данных. Он просто возвращает те же значения, что и при первой загрузке listSession перед сохранением чего-либо.

Ниже приведен код, который лучше всего повторяет сценарий: -

        [Test]
    public void SessionPerPresenter()
    {
        //This session is the one that is used to load all salesorders from the      database. It's lifetime is the lifetime of the form but as you double click on an entry in the list to edit it will stay alive longer than the session in the edit form
        ISession listSession = NHibernateHelper.OpenSession();

        SalesOrder order = new SalesOrder("P123435", "ACME");
        order.AddLine(new SalesOrderLine("Beans", 15));
        order.AddLine(new SalesOrderLine("Coke", 24));
        order.AddLine(new SalesOrderLine("Pepsi", 3));
        order.AddLine(new SalesOrderLine("Apples", 4));

        //this session is the equivalent of the one in the Edit Form as soon as the entity is Saved
        //the session is disposed
        using (ISession session = NHibernateHelper.OpenSession())
        {
            session.SaveOrUpdate(order);
            ID = order.SalesOrderID;
        }

        //retrieve all SalesOrders from the database and store them in a list
        IList<SalesOrder> salesOrders = listSession.CreateCriteria<SalesOrder>().List<SalesOrder>();
        foreach (SalesOrder so in salesOrders)
        {
            Console.WriteLine(so.ToString());
        }

        //edit the selected order and update its order code value and resave
        using (ISession session = NHibernateHelper.OpenSession())
        {
            hydratedSalesOrder = session.Get<SalesOrder>(ID);
            hydratedSalesOrder.OrderCode = "1234-5678";
            session.SaveOrUpdate(hydratedSalesOrder);
            session.Flush();
        }

        //re-retrieve the list of orders from the database. Using SQLServer Profiler / NHibernate profiler
        //you can see the query being sent to the database so I don't believe it is in the cache. Indeed, if you run
        //the query directly against the database the value 1234-5678 is returned. Can't work out why
        //the listSession does not have the values read from the database in it but has the values from the
        //original list retrieval.
        salesOrders = listSession.CreateCriteria<SalesOrder>().List<SalesOrder>();
        foreach (SalesOrder so in salesOrders)
        {
            Console.WriteLine(so.ToString());
        }
        listSession.Close()
    }

Может ли кто-нибудь помочь мне с тем, что здесь происходит? Что я делаю неправильно? Я что-то упускаю из жизни? Если бы он не запрашивал базу данных, я бы подумал, что это связано с кэшем первого уровня, но это маловероятно.

1 Ответ

0 голосов
/ 07 сентября 2010

Чтобы гарантировать, что ваши сущности не кэшированы, нужно очистить сеанс с ISession.Clear(). Также вы можете выселить отдельных лиц, позвонив по номеру ISession.Evict(object entity).

Если вы не уверены в том, что происходит в вашем приложении, рассмотрите инструмент профилирования, например nhprof .

Быстрое примечание: использование сеанса в течение срока действия диалогового окна может быть полезно в небольших приложениях без проблем параллелизма, но в долгосрочной перспективе у вас будут проблемы. Сессия должна быть открыта поздно, а закрыта рано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...