RavenDB как смывать? - PullRequest
       15

RavenDB как смывать?

7 голосов
/ 07 февраля 2012

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

Это не работает для меня, так как файлы не возвращаются

 using (var session = _dataDocumentStore.Instance.OpenSession())
 {
         session.Store(file);
         session.SaveChanges();
 }

....

using (var session = _dataDocumentStore.Instance.OpenSession() )
{
          return session.Query<File>().ToList();
}

Я создал метод Flush, который удаляет и воссоздаетEmbeddableDocumentStore, который работает, но поскольку это что-то, что кажется фундаментальным, я могу поступить неправильно:

  public static IDocumentStore Initialize()
        {
            instance = new EmbeddableDocumentStore
            {
                DataDirectory = "App_Data/Database",
                UseEmbeddedHttpServer = true,


            };

            instance.Initialize();
            return instance;
        }

        public void Flush()
        {
            instance.Dispose();
            Initialize();

        }

Как вы сохраняете в RavenDB, а затем проверяете, что он сохранился?Любой совет по этому поводу был бы великолепен

Ответы [ 2 ]

15 голосов
/ 08 февраля 2012

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

Поэтому, когда ваши тесты говорят: -

  1. Store and SaveChanges.
  2. Загрузка.
  3. Была ли загружена эта загрузка?

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

Итак, как сказал Дэниэл Лэнг, вам нужно дождаться устаревших результатов.

НО .. вам придется сделать это для запроса -every-, который вы хотите проверить,в вашем коде.Итак ... давайте обманывать (юридически):)

Сообщите вашему хранилищу документов ВСЕГДА ждать устаревших результатов, если что-то запросит хранилище.

Как?

// Initialise the Store.
var documentStore = new EmbeddableDocumentStore
                    {
                        RunInMemory = true
                    };
documentStore.Initialize();

// Force query's to wait for index's to catch up. Unit Testing only :P
documentStore.RegisterListener(new NoStaleQueriesListener());

....


#region Nested type: NoStaleQueriesListener

public class NoStaleQueriesListener : IDocumentQueryListener
{
    #region Implementation of IDocumentQueryListener

    public void BeforeQueryExecuted(IDocumentQueryCustomization queryCustomization)
    {
        queryCustomization.WaitForNonStaleResults();
    }

    #endregion
}

#endregion

Теперь, чтобы увидеть это в действии, посмотрите RavenOverflow @ github.И проект Tests в этом решении обладает той любовью, которую вы можете пожелать:)

enter image description here

12 голосов
/ 07 февраля 2012

Причина в том, что индекс воронов слишком устарел, чтобы что-то здесь возвращать.Вам нужно сделать это:

session.Query<File>()
    .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
    .ToList();

Для дальнейшего чтения, перейдите сюда: http://ravendb.net/docs/client-api/querying/stale-indexes

...