Отказ от ответственности: это не рекомендуемый подход, и на самом деле это плохая практика - открывать IDocumentSession, который будет существовать столько же, сколько и клиентское приложение.Альтернативное решение см. В ответе, опубликованном здесь: RavenDB Catch 22 - оптимистичный параллелизм и просмотр изменений от других клиентов .
Похоже, у меня работает оптимистичный параллелизм, поэтому я подумал:Публикуйте это, чтобы помочь кому-либо еще.
Сначала в DataAccessLayerBase я инициализирую DocumentStore и IDocumentSession.Они будут открыты и будут использоваться до тех пор, пока запущено клиентское приложение.
public abstract class DataAccessLayerBase
{
protected static DocumentStore Database { get; private set; }
protected static IDocumentSession Session { get; private set; }
static DataAccessLayerBase()
{
if (Database != null) { return; }
Database = GetDatabase();
Session = GetSession();
}
private static DocumentStore GetDatabase()
{
string databaseUrl = ConfigurationManager.AppSettings["databaseUrl"];
DocumentStore documentStore = new DocumentStore();
try
{
documentStore.Url = databaseUrl;
documentStore.Initialize();
}
catch
{
documentStore.Dispose();
throw;
}
return documentStore;
}
private static IDocumentSession GetSession()
{
IDocumentSession session = Database.OpenSession();
session.Advanced.UseOptimisticConcurrency = true;
return session;
}
}
Далее, при получении данных используйте существующий сеанс:
public class CustomVariableGroupData : DataAccessLayerBase, ICustomVariableGroupData
{
public IEnumerable<CustomVariableGroup> GetAll()
{
return Session.Query<CustomVariableGroup>();
}
}
Наконец, при сохранении,получите eTag и сохраните.
public class GenericData : DataAccessLayerBase, IGenericData
{
public void Save<T>(T objectToSave)
{
Guid eTag = (Guid)Session.Advanced.GetEtagFor(objectToSave);
Session.Store(objectToSave, eTag);
Session.SaveChanges();
}
}
Если другой экземпляр пользовательского интерфейса работает и изменяет объект, возникнет исключение параллелизма.И это то, что мы хотели.
Я просто снова посмотрел на заголовок этого поста и понял, что это не отвечает на вопрос о том, как установить параллелизм в конфигурационном файле сервера.Однако, поскольку теперь он может быть установлен один раз в слое данных, для меня этого достаточно.