从 DbContext 中提取 EF Core DbContextOptions

Extract EF Core DbContextOptions from DbContext

创建 DbContext 后,是否可以提取用于创建它的 DbContextOptions

(可能通过使用类似于 RelationalOptionsExtension.Extract() 的东西、EF 基础设施服务等)

对于每个 DbContext 实例,

OnConfiguring 是 运行,因此您可以覆盖它以检查和修改传入的 DbContextOptionsBuilder。

我使用的是一个工厂方法,它可以 return 一个 DbContext 或一个 DbContextOptions 对象。之后我在 DI (Autofac) 或 unitests(通常是内存数据库)中使用它。

如果这不是一个选项,您可能可以使用反射并创建一个扩展方法到 return 来自 DbContext 对象的私有字段 private readonly DbContextOptions _options;。这是一种 hack 和解决方法,如果您控制 DbContext 的实例化,我会使用选项一。

没有官方 (public) 方式。但是您可以使用两种(内部)基础设施方法来获取它。

首先是 GetService<TService> extension method located in AccessorExtensions class,然后可用于获取 IDbContextServices 服务实例 - 未记录,但其成员之一是

IDbContextOptions ContextOptions { get; }

这正是您所需要的。

所以代码是这样的:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Internal;

DbContext dbContext;
var dbOptions = db.GetService<IDbContextServices>().ContextOptions;

请注意 return 类型是接口,但如果需要可以转换为 DbContextOptions