С RavenDB, создавая IDocumentSession
при запуске приложения (и никогда не закрывая его, пока приложение не будет закрыто), я могу использовать оптимистичный параллелизм, выполняя это:
public class GenericData : DataAccessLayerBase, IGenericData
{
public void Save<T>(T objectToSave)
{
Guid eTag = (Guid)Session.Advanced.GetEtagFor(objectToSave);
Session.Store(objectToSave, eTag);
Session.SaveChanges();
}
}
Если другой пользовательизменил этот объект, тогда сохранение будет некорректно завершено.
Но то, что я не могу сделать, когда при использовании одного сеанса за время жизни приложения наблюдаются изменения, сделанные другими экземплярами приложения (скажем,Джо, пять тв), к документам.Когда я делаю это, я не вижу изменений Джо:
public class CustomVariableGroupData : DataAccessLayerBase, ICustomVariableGroupData
{
public IEnumerable<CustomVariableGroup> GetAll()
{
return Session.Query<CustomVariableGroup>();
}
}
Примечание: я тоже пробовал это, но он также не отображал изменения Джо:
return Session.Query<CustomVariableGroup>().Customize(x => x.WaitForNonStaleResults());
Теперь, если я пойду другим путем и создам IDocumentSession
внутри каждого метода, который обращается к базе данных, у меня возникает противоположная проблема.Поскольку у меня новый сеанс, я вижу изменения Джо.Buuuuuuut ... тогда я теряю оптимистичный параллелизм.Когда я создаю новый сеанс перед сохранением, эта строка создает пустой GUID и, следовательно, дает сбой:
Guid eTag = (Guid)Session.Advanced.GetEtagFor(objectToSave);
Чего мне не хватает?Если сеанс не следует создавать внутри каждого метода или на уровне приложения, то какова правильная область?Как я могу получить преимущества оптимистичного параллелизма и возможности видеть изменения других при выполнении Session.Query ()?