从 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
。
创建 DbContext
后,是否可以提取用于创建它的 DbContextOptions
?
(可能通过使用类似于 RelationalOptionsExtension.Extract()
的东西、EF 基础设施服务等)
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
。