2017-10-16 70 views
0

我正在寻找拦截Session.SaveChanges()的方法,以便我可以使用同一个会话实例执行一些额外的工作(在某些情况下,这很方便)。如何拦截RavenDb Session.SaveChanges()

编辑:有关重新使用会话的一点是,我有一个需要在同一事务运行更多的工作。

我已经知道(并利用)IDocumentStoreListener - 但这个接口没有帮助,因为它没有给我访问当前会话。

我在RavenDb文档中找不到任何有关拦截SaveChanges调用并获取当前会话句柄的方法。有谁知道一种方式?

+0

这是一个web应用程序?通常,对于MVC和Web API应用程序,您可以为每个OWIN上下文创建一个文档会话。 –

+0

它需要在Web应用程序和webjobs(或任何其他上下文)中工作。我们已经不再使用每个请求一个会话,因为它带来了比解决问题更多的问题。 我现在有一个解决方案,但还没有时间去实施它。当我完成它时,会再次发布 –

+0

我很好奇听到您对每个请求进行会话有什么问题。我已经为每个请求使用一个会话构建了许多Web应用程序(某些企业级应用程序),并且它工作得很好。 –

回答

0

打开一个新的会话它是免费的(在性能方面),我认为IDocumentStoreListener已被认为是你在找什么。我不知道其他方法如你所说。

实施 void AfterStore(string key, object entityInstance, RavenJObject metadata); 你所有关于所存储实体的信息,那么你可以做你所需要的

+0

开新会确实是免费的,但这不是我所需要的。我需要在同一笔交易中做更多的工作。我已经更新了这个问题。 Oren建议使用CallContext存储会话(https://groups.google.com/forum/#!topic/ravendb/bXeUJ3qVBpQ),我正在研究这个问题。但我不确定会话是否可以存储在CallContext中,因为它可能会被序列化。 –

+0

@Øyvind这是一个解决方法,但是:如果你使用before store来做你需要的东西,如果失败了,你可以返回false或抛出异常 – Embri

+0

问题仍然存在:如何让你的手在_current_ session上。打开一个新的很容易,但这不是我需要的。 –