Запрос NHibernate возвращает изменения, еще не сохраненные в базе данных - PullRequest
0 голосов
/ 23 июля 2010

Следующий модульный тест не пройден, я вносю изменения в объект, который я извлек, а затем в том же сеансе я делаю запрос, который, кажется, учитывает незафиксированные изменения, которые я внес в объект.

Как заставить NHibernate игнорировать любые незафиксированные изменения и запрашивать только базу данных?

[Test]
public void Test()
{
    // Arrange
    Area area1 = new Area { Name = "Area 1" };
    Area area2 = new Area { Name = "Area 2" };
    using (ISession session = SessionFactory.OpenSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            session.Save(area1);
            session.Save(area2);
            transaction.Commit();
        }
    }
    int resultCount;

    // Act
    using (ISession session = SessionFactory.OpenSession())
    {
        Area existingArea;
        using (var transaction = session.BeginTransaction())
        {
            existingArea = session.Get<Area>(area1.ID);
        }

        existingArea.Name = area2.Name;

        using (var transaction = session.BeginTransaction())
        {
            resultCount = session.CreateCriteria<Area>().Add(Restrictions.Eq("Name", existingArea.Name)).List<Area>().Count;
        }
    }

    // Assert
    Assert.AreEqual(1, resultCount);
}

Ответы [ 2 ]

4 голосов
/ 23 июля 2010

Я нашел то, что мне нужно:

session.FlushMode = FlushMode.Commit;

Проблема была вызвана тем, что FlushMode по умолчанию (FlushMode.Auto) иногда сбрасывает изменения в базе данных перед запросами, чтобы предотвратить устаревшие чтения.Изменяя FlushMode.Commit, он записывает изменения в базу данных только при вызове commit, что соответствует моим потребностям.

Спасибо за вашу помощь, gillyb.

1 голос
/ 23 июля 2010

Все изменения, которые вы делаете в течение сеанса, являются постоянными в течение сеанса. Таким образом, внутри сеанса нет способа узнать, какие данные были изменены ранее в сеансе и какие данные соответствуют схеме базы данных.

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

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

...