Я пытаюсь преобразовать свой собственный блог из MSSQL / EF в RavenDB, и по большей части он до сих пор был довольно безболезненным, но у меня возникла проблема с тем, что, как я подозреваю, является «устаревшими индексами» или чрезмерноНапористое кеширование, но я не могу получить никаких реальных ответов.Проще продемонстрировать, чем объяснить, когда я не знаю, в чем собственно проблема.
Настройка:
// Basic example class
public class ExampleClass{
public int ID {get;set;}
public string Value {get;set;}
}
// Once at application startup:
_docStore = new DocumentStore {
Url = "http://localhost:8080",
DefaultDatabase = "exampleDB",
Credentials = new NetworkCredential("userfoo","passbar"),
};
_docStore.Initialize();
// Querying data:
using (var session = _docStore.OpenSession())
{
var results = _session.Query<ExampleClass>().ToList();
foreach(var result in results)
{
Console.WriteLine(string.Format("ID #{0}: {1}",
result.ID, result.Value));
}
}
Проблема в следующем: Всякий раз, когда я обновляю документы программно через сеанс _docStore, все работает нормально.Когда я редактирую данные извне (из другого клиента, в студии управления RavenDB и т. Д.), Обновления документа не возвращаются.Вот несколько примеров.
1) Начальные значения в базе данных
Документы в базе данных:
- ExampleClass / 1 {"ID": 1, "Value": "foo",}
- ExampleClass / 2 {"ID": 2, "Value": "bar",}
Выполнить запрос;Результат консоли:
2) После обновленияЗначение ExampleClass / 2 для "BAR" через сеанс _docStore.
Документы в базе данных:
- ExampleClass / 1 {"ID": 1, "Value": "foo",}
- ExampleClass / 2 {"ID": 2, "Value": "BAR",}
Выполнить запрос;Результат консоли:
3) После обновленияЗначение ExampleClass / 2 для "bah" через RavenDB studio
Документы в базе данных:
- ExampleClass / 1 {"ID": 1,"Value": "foo",}
- ExampleClass / 2 {"ID": 2, "Value": "bah",}
Выполнить запрос;консольный результат:
4) После добавленияExampleClass / 3 через RavenDB studio
Документы в базе данных:
- ExampleClass / 1 {"ID": 1, "Значение": "foo ",}
- ExampleClass / 2 {" ID ": 2," Value ":" bah ",}
- ExampleClass / 3 {" ID ": 3," Value ":"спам ",}
Выполнить запрос;Результат консоли:
- ID # 1: foo
- ID # 2: BAR
- ID # 3: спам
5) После удаления ExampleClass / 2 через RavenDB studio
Документы в базе данных:
- ExampleClass / 1 {"ID": 1, "Value": "foo",}
- ExampleClass / 3 {"ID": 3, "Value": "spam",}
Выполнить запрос;результат консоли:
6) После измененияЗначение ExampleClass / 3 через RavenDB studio
Документы в базе данных:
- ExampleClass / 1 {"ID": 1, "Value":"foo",}
- ExampleClass / 3 {"ID": 3, "Value": "SPAM",}
Выполнить запрос;консольный результат:
6) После добавленияExampleClass / 4 через RavenDB studio
Документы в базе данных:
- ExampleClass / 1 {"ID": 1, "Значение": "foo ",}
- ExampleClass / 3 {" ID ": 3," Value ":" СПАМ ",}
- ExampleClass / 4 {" ID ": 4," Value ":"bar ",}
Выполнить запрос;Результат консоли:
- ID # 1: foo
- ID # 3: спам
- ID # 4: bar
* 7) После инициализации нового хранилища документов (без изменений данных) *
Документы в базе данных:
- ExampleClass/ 1 {"ID": 1, "Value": "foo",}
- ExampleClass / 3 {"ID": 3, "Value": "SPAM",}
- ExampleClass/ 4 {"ID": 4, "Значение": "bar",}
Выполнить запрос;консольный результат:
- ID # 1: foo
- ID # 3: СПАМ
- ID # 4: бар
Надеюсь, это достаточно хорошо показывает, где что-то идет не так. Добавление и удаление целых документов отражается нормально, но обновления полностью игнорируются после первой загрузки, что заставляет меня подозревать кэширование, а не «устаревший индекс» ... но я пробовал подобные вещи без удачи:
// After initialising document store:
_docStore.DisableAggressiveCaching();
_docStore.DatabaseCommands.DisableAllCaching();
_docStore.Conventions.DefaultQueryingConsistency =
ConsistencyOptions.QueryYourWrites;
// Whenever opening a new session:
_session.Advanced.DatabaseCommands.DisableAllCaching();
_session.Advanced.AllowNonAuthoritativeInformation = false;
// When querying:
var result = _session.Query<ExampleClass>()
.Customize(x=>x.WaitForNonStaleResults())
.ToList();
Что происходит! $ # *? Почему RavenDB ненавидит меня?