【问题标题】:Is there a way to set up an Entity Framework Core DbContext with a connection factory?有没有办法使用连接工厂设置实体框架核心 DbContext?
【发布时间】:2021-04-16 15:00:31
【问题描述】:

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

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

在云解决方案中,您希望您的凭据在 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_System_Action_Microsoft_EntityFrameworkCore_Infrastructure_SqlServerDbContextOptionsBuilder__

【问题讨论】:

    标签: c# async-await entity-framework-core


    【解决方案1】:

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

    答案是:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 2020-10-15
      • 2017-06-15
      • 2020-04-18
      • 2017-10-01
      • 2021-11-18
      • 1970-01-01
      • 2020-05-16
      相关资源
      最近更新 更多