2

就我而言,我有几个共享同一个数据库的 EF 上下文(即,所有表都在同一个数据库上),我想在所有上下文中共享同一个 SqlConnection,以便我可以在同一个事务中应用多个更改.

为了实现这一点,我首先SqlConnection使用以下代码注册:

services.AddScoped(sp => new SqlConnection(Configuration.GetConnectionString("DefaultConnection")));

完成此操作后,我更改了其中一个 EF 上下文,以便它重用相同的连接:

services.AddDbContext<ApplicationDbContext>((provider, options) =>

options.UseSqlServer(provider.GetRequiredService()));

在注册配置和操作存储时,我需要做类似的事情。与 EF 扩展方法不同,没有允许我传递引用选项构建器和服务提供者的操作的重载:

services.AddIdentityServer()
            .AddConfigurationStore(options =>
            {
                // HERE: no serviceprovider, how can I get the SqlConnection object???
                options.ConfigureDbContext = builder =>
                    builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
                        sql => sql.MigrationsAssembly(migrationsAssembly));
            })

builder.UseSqlServer确实有一个允许我传递连接的重载,但是如何在运行时解析 SqlConnection 以便在所有上下文中共享相同的连接?

谢谢,

路易斯

4

1 回答 1

1

男人自己回答:)

而不是使用该CondigureDbContext属性,您应该使用ResolveDbContextOptions

.AddConfigurationStore(options => {
     options.ResolveDbContextOptions = (provider, builder) => 
     builder.UseSqlServer(provider.GetRequiredService<Foo>().FooValue);
})
于 2019-01-10T08:34:52.407 回答