2017-10-16 86 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上。打開一個新的很容易,但這不是我需要的。 –