繁体   English   中英

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

[英]Is there a way to set up an Entity Framework Core DbContext with a connection factory?

在针对 SQL 服务器创建 Entity Framework Core DbContext 时,您似乎有三个选项,提供一个连接字符串到 DbContextOptionsFactoryExtension 方法 UseSqlServer 的一个重载,一个 DbConnection 直接到另一个(大奖?对 - 等等),或者尝试和 Z34D1F91FB2E514B8576FAB1A75A89A6B使用 DbContextFactory。

不过我想知道,如果您像我一样在 DI 中配置了一个您希望 EfCore 使用的连接工厂怎么办? 你怎么把它挂起来? 基本上我需要一些可以让我注册一些 class 的东西,我可以通过 DI 连接,或者至少一个 Func<IServiceProvider, IDbConnection> 甚至 Func<IServiceProvider, string> 以便我可以解析我的工厂并创建一个弹性连接或网络上至少有 go 并获取新的信用。

在云解决方案中,您希望您的凭据在 KeyVault/Secrets Manager/您拥有什么 - 但每次访问都需要花钱,因此您希望使用缓存的内容,直到您自动查询凭据的那一天保险库以获得新的信用,然后再试一次。

如果 s#,t 击中风扇并且数据库已恢复(因为“恢复”意味着“现在已使用原始数据库中的旧数据创建了一个新数据库”),则同样的事情。 所以无论哪种方式 - 你需要刷新你的配置,因为我在其他地方使用 Dapper,我已经有了这样一个云就绪连接工厂。 我也只想从实体框架中使用它。

基本上 - 我在 ConfigureServices 时不确定正确的连接字符串 - 所以我什至不能在这里创建一个连接。 我需要某种services.AddTransient<IDbConnectionThing>(sp => sp.GetService<CoolFactory>().CreateInstance()); 推迟获得正确的连接字符串或理想情况下创建我已验证可以正常工作的连接 - 到构造 IServiceProvider 实例时。

如果连接工厂的想法过于疯狂和疯狂,我对任何能让我向保险库索取新凭据的解决方法感到满意,但我无法找到一种方法来执行异步操作并在注册时返回新的连接字符串EF 连接字符串,没有执行超级全局方法 sync-over-async,这意味着 David Fowler 会感觉到 Force 中的干扰。

文档: https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.sqlserverdbcontextoptionsextensions.usesqlserver?view=efcore-5.0#Microsoft_EntityFrameworkCore_SqlServerDbContextOptionsExtensions_UseSqlServer_Microsoft_EntityFrameworkCore_DbContextOptionsBuilder_Infrastructure_Action_MicrosoftDbContextOptionsBuilder_Instruction_Action_MicrosoftDb

朱莉·勒曼回答了这个问题。

答案是:

  1. 创建一个继承 DbConnectionInterceptor 的新 class,特别是覆盖 ConnectionOpening/ConnectionOpeningAsync (我不应该使用同步版本,但我不希望这成为我发现我是否在某处搞砸的方式)。
  2. 在 Startup.cs 的 AddDbContext 部分注册拦截器:
 services.AddSingleton<AConnectionInterceptor>();
 services.AddDbContext<ADbContext>((provider, options) =>
 {
    options.UseSqlServer(pointlessConnectionString);
    options.AddInterceptors(provider.GetRequiredService<AConnectionInterceptor>());
 });

我重构了工厂的内部结构,以便在现有连接上完成工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM