Was your experience in using RavenDB on a desktop application? I ask because my experience contradicts a few of yours: You can control transaction scope with repository pattern, but you do it by abstracting a UoW as well. Basically something similar to DbContext where you have a single interface that contains properties that are all of your collection repositories. This UoW takes the session as a ctor and passes that into all of the other repositories as they're requested. Then in your repos, you just never call save changes. So then in your service, you request the UoW instead, and you can work across whatever collections you want and call savechanges whenever you want. It has worked very well for me. I also implemented a base repository for crud operations and have no issues with sessions. What I do is inherit them on repos that can perform crud operations and extend them with the repo's interface for more bespoke operations. So when you request the repo/collection in your service, you'll have both. My implementations were for web services, desktop applications. I did have a problem with sessions when I tried to access the database directly from Blazor because it uses a single session for the entire SPA. There were two solutions for it though: When requesting the repo via DI, make sure you're getting back a new scope every time. Move all database operations out of the UI and into an API which is what I ended up doing for other reasons. Since the API is stateless, this problem works itself out.