使用 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>();
}
}
注意:我也试过这个,但也没有显示 Joe 的更改:
return Session.Query<CustomVariableGroup>().Customize(x => x.WaitForNonStaleResults());
现在,如果我采用另一种方式,并IDocumentSession
在每个访问数据库的方法中创建一个,那么我就会遇到相反的问题。因为我有一个新会话,所以我可以看到 Joe 的更改。Buuuuuuut ...然后我失去了乐观并发。当我在保存之前创建一个新会话时,此行会产生一个空的 GUID,因此会失败:
Guid eTag = (Guid)Session.Advanced.GetEtagFor(objectToSave);
我错过了什么?如果一个 Session 不应该在每个方法中创建,也不应该在应用程序级别创建,那么正确的范围是什么?在执行 Session.Query() 时,如何获得乐观并发的好处以及查看他人更改的能力?