-
Notifications
You must be signed in to change notification settings - Fork 2k
Document EnableServiceProviderCaching and UseMemoryCache configuration in EF Core #5116
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
base: main
Are you sure you want to change the base?
Conversation
Co-authored-by: AndriySvyryd <[email protected]>
Co-authored-by: AndriySvyryd <[email protected]>
samples/core/Miscellaneous/CachingConfiguration/CachingConfiguration.csproj
Outdated
Show resolved
Hide resolved
Co-authored-by: AndriySvyryd <[email protected]>
Co-authored-by: AndriySvyryd <[email protected]>
Co-authored-by: AndriySvyryd <[email protected]>
…arios Co-authored-by: AndriySvyryd <[email protected]>
Co-authored-by: AndriySvyryd <[email protected]>
Updated the PR description with a comprehensive summary of the changes, including what was documented, the technical details, and the documentation structure. |
Co-authored-by: AndriySvyryd <[email protected]>
Co-authored-by: AndriySvyryd <[email protected]>
|
|
||
| Using dependency injection, this can be achieved by either registering the context as scoped, and creating scopes (using `IServiceScopeFactory`) for each thread, or by registering the `DbContext` as transient (using the overload of `AddDbContext` which takes a `ServiceLifetime` parameter). | ||
|
|
||
| ## EnableServiceProviderCaching |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm conflicted about this sort of documentation. Yes, we have EnableServiceProviderCaching() as a public API, but this is something that I think we'd never recommend users ever actually use
So I'm not sure whether (and why) we should actually be documenting this - it runs the risk of pushing people towards an API they shouldn't use, it makes this doc page less useful (since it gets bloated with a non-useful API), and it creates more work for us (writing/reviewing the docs).
If we believe there are legitimate reasons for users to use this (I'm not really aware of any), then these should be documented here. There's just one sentence below: "for testing environments to ensure each test gets a fresh service provider when DbContext configurations change test-to-test", but I'm unclear as to when users would actually run into this: most settings don't require a different service provider, and those that do generally should be singleton options, so a new service provider is created anyway.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not documenting API to discourage its use is not a good strategy. We've seen that even pubternal API without XML docs will get used if the users this they need it. I think that explaining the appropriate use cases and downsides is valuable and is more likely to reduce incorrect usage.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree that there should be good xmldocs (hopefully there are), but I don't think what you say holds for conceptual docs. A user sees xmldocs for an API once they're already using (or considering using) that API, so it's important for that to be there, and properly explain things. In contrast, conceptual documentation is how users discover an API: before they come to this "DbContext configuration" page, they're 99% unaware that EnableServiceProviderCaching even exists, and this PR will make them aware of it.
In other words, this effectively sends out a "marketing message" to tell users that this API exists, when they (almost certainly) didn't know it existed before.
The main question IMHO is whether you think this API makes sense for more than 1% of EF users - I don't see that it does. Assuming we agree on that, and this API is indeed a pit of failiure for the 99% case, we're doing our users a disservice by talking about it and making them aware of it. It may have been a mistake to even introduce this API, but then we'd be compounding that mistake by marketing it here, mostly in the name of an "all APIs should be documented in conceptual docs" rule.
An additional reason to not document this, is that every additional paragraph in the conceptual docs makes them less useful. We already have a history of falling into this, producing pages which are so huge that nobody even starts reading them - all the in the name of completeness/exhaustiveness, or the fear of being accused of having neglected to document something. I don't believe that's a good way to write docs.
If I've misunderstood and you actually think that disabling service provider caching is useful for some non-contrived, non-edge-casey scenarios, let me know (the above is written with that assumption).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a valid scenario to use this in testing. We occasionally get questions about it, and I don't want to keep repeating the answer. I can move this to a new page under https://learn.microsoft.com/en-us/ef/core/testing/ to reduce length and visibility
Co-authored-by: AndriySvyryd <[email protected]>
Summary
This PR adds comprehensive documentation for EF Core's memory caching configuration options, specifically
EnableServiceProviderCachingandUseMemoryCache. The documentation explains where these features are used, what the defaults are, and when to customize them.What's Documented
EnableServiceProviderCaching
true) - service providers are cached and reused acrossDbContextinstances with the same configurationDbContextcreation. Only consider for testing purposes when replacing servicesDbContextinstancesUseMemoryCache / Memory Cache Integration
IMemoryCacheused by EF Core for internal caching operations like query compilation and model buildingIMemoryCachewith a default size limit of 10240AddMemoryCacheif you need to change the default size limitsIMemoryCacheis not used for internal service provider caching (separate feature)Documentation Changes
Updated Files
entity-framework/core/dbcontext-configuration/index.md
EnableServiceProviderCachingandUseMemoryCacheto the DbContext configuration options table## EnableServiceProviderCachingsection with complete explanation of service provider caching## Memory Cache Integrationsection explainingIMemoryCacheconfigurationentity-framework/core/performance/advanced-performance-topics.md
Documentation Structure
##heading level for clear organizationKey Technical Details
DbContextcreationFixes #4855
Fixes #3102
Original prompt
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.