C# 有没有办法用连接工厂设置实体框架核心DbContext?

C# 有没有办法用连接工厂设置实体框架核心DbContext?,c#,async-await,entity-framework-core,C#,Async Await,Entity Framework Core,在针对SQL Server创建实体框架核心DbContext时,您似乎有三个选项:向DBContextOptions FactoryExtension方法UseSqlServer的一个重载提供连接字符串,直接向另一个重载提供DbConnection(jackpot?Right-well wait),或者尝试使用DbContextFactory 但我想知道,如果您希望我在DI中配置一个连接工厂,并且希望EfCore使用该工厂,该怎么办?你怎么把它连接起来的?基本上,我需要一些东西,要么让我注册一些

在针对SQL Server创建实体框架核心DbContext时,您似乎有三个选项:向DBContextOptions FactoryExtension方法UseSqlServer的一个重载提供连接字符串,直接向另一个重载提供DbConnection(jackpot?Right-well wait),或者尝试使用DbContextFactory

但我想知道,如果您希望我在DI中配置一个连接工厂,并且希望EfCore使用该工厂,该怎么办?你怎么把它连接起来的?基本上,我需要一些东西,要么让我注册一些可以通过DI连接的类,要么至少注册一个Func,甚至Func,这样我就可以解析我的工厂并创建一个弹性连接,或者至少在网络上获取新的信任

在云解决方案中,您希望凭证在KeyVault/Secrets Manager/what have中自动旋转,但每次访问都要花钱,因此您希望使用缓存的凭证,直到凭证旋转的那一天,自动查询vault以获取新的凭证并重试

如果s#也是一样!t点击风扇,数据库已经被恢复(因为“恢复”意味着“一个新的数据库已经用原始数据库中的旧数据创建了”,所以无论哪种方式,您都需要刷新配置。由于我在其他地方使用Dapper,我已经有了这样一个云连接工厂,我只想在实体框架中使用它

基本上-我在ConfigureServices时不知道正确的连接字符串-所以我甚至不能在这里创建连接。我需要某种
services.AddTransient(sp=>sp.GetService().CreateInstance())
延迟获取正确的连接字符串或理想情况下创建一个我已验证有效的连接,直到构建IServiceProvider实例

如果连接工厂的想法太疯狂和疯狂,我很高兴有任何解决方法可以让我向vault询问新的凭据,但我找不到一种方法来进行异步操作并在注册EF连接字符串时返回新的连接字符串,如果不使用超级全局方法,则通过异步同步,这意味着David Fowler将感觉到原力中的干扰

文件:
_朱莉·勒曼回答了这个问题

答案是:

  • 创建一个继承DbConnectionInterceptor的新类,特别是ooverride这两个ConnectionOpening/ConnectionOpeningAsync(我不应该使用同步版本,但我不希望这是我发现自己在某个地方出错的方式)
  • 在Startup.cs的AddDbContext部分注册拦截器:
  • services.AddSingleton();
    services.AddDbContext((提供者,选项)=>
    {
    使用SQLServer(无点连接字符串);
    options.AddInterceptors(provider.GetRequiredService());
    });
    
    我重构了我的工厂,在现有的连接上进行工作