Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add an interceptor to an existing DbContext instance #20273

Open
Giorgi opened this issue Mar 13, 2020 · 11 comments
Open

Add an interceptor to an existing DbContext instance #20273

Giorgi opened this issue Mar 13, 2020 · 11 comments

Comments

@Giorgi
Copy link
Contributor

Giorgi commented Mar 13, 2020

I know that interceptors can be added when creating the model using DbContextOptionsBuilder.AddInterceptors method but is there a way to add an interceptor instance on an existing DbContext instance?

This can be useful for third party library developers which want to add interception capability to the existing DbContext instance.

@ajcvickers
Copy link
Member

Putting this on the backlog as something that would be useful. However, traditional events may be more appropriate--see #626.

@Giorgi
Copy link
Contributor Author

Giorgi commented Mar 15, 2020

So this means that there is no way to do it in the 3.1 version right ?

@ajcvickers
Copy link
Member

@Giorgi Correct.

@Giorgi
Copy link
Contributor Author

Giorgi commented Mar 15, 2020

There is also no way to get the command text and parameters from IQueryable<> neither.

@ajcvickers
Copy link
Member

@Giorgi See #19358

@Giorgi
Copy link
Contributor Author

Giorgi commented Mar 15, 2020

Yes, looks like I will have to wait until EF Core 5

@AndriySvyryd AndriySvyryd changed the title Add interceptor on an existing DbContext item. Add an interceptor to an existing DbContext instance Jan 14, 2022
@jamiewinder
Copy link

jamiewinder commented Feb 27, 2023

Since this is quite an old issue, is there a way to do this currently? In my case, I'm hoping to be able to attach a connection interceptor to an existing DbContext (or through a IDbContextFactory if more appropriate) with an interceptor that performs tenancy isolation. Basically so I can implement a DbContext CreateTenantContext(Guid tenantId) factory method. As far as I can tell, my only option at the moment is to create a DbContext, force the connection to open (so it stays open), and then run a command on it.

@ajcvickers
Copy link
Member

@jamiewinder With a context factory, you control creating the instance of the context, so you can add whatever interceptors you want there. There isn't a way to add interceptors after the context has been initialized; this issue is tracking that.

@jamiewinder
Copy link

@ajcvickers Thanks. Just to make sure I'm understanding correctly, I think I'm correct in saying that currently I can only control which interceptors are added when the factory is created rather than when I ask if for a context to be created? i.e. I can't do anything like this:

private readonly IDbContextFactory<MyContext> _contextFactory;

public MyContext CreateTenantContext(Guid tenantId)
{
   var setTenancyInterceptor = new SetTenancyInterceptor(tenantId);
   return _contextFactory.CreateDbContextWithInterceptors(setTenancyInterceptor);
}

(obviously CreateDbContextWithInterceptors isn't a thing, just an example)

@ajcvickers
Copy link
Member

You can do whatever you want in your implementation of IDbContextFactory.

@jamiewinder
Copy link

It seems I grossly overestimated what was involved in creating a IDbContextFactory! That's perfect, thanks for the pointers!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants