我想做这样的事情, 但上下文始终为空:
public DbCheck(IEnumerable<DbContext> contexts)
背景:
public class c1( DbContextOptions<c1> options ) : DbContext( options )
报名:
services.AddDbContext<c1>( options => );
您可以尝试以下示例:
c1.cs(正确的连接字符串)
public class c1 :DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Data Source=192.168.2.68;Initial Catalog=test123;User ID=sa;Password=Q!q11111;TrustServerCertificate=True");
}
}
c2.cs(错误的连接字符串)
public class c2 : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Wrong string");
}
}
程序.cs
builder.Services.AddDbContext<c1>();
builder.Services.AddDbContext<c2>();
控制器
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IServiceProvider serviceProvider;
public ValuesController(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
[HttpGet("test")]
public void test()
{
var type = typeof(DbContext);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p))
.ToList();
for (int i = 0; i < types.Count - 1; i++)
{
DbContext context_instance=(DbContext) serviceProvider.GetService(types[i]);
bool result=context_instance.Database.CanConnectAsync().GetAwaiter().GetResult();
Console.WriteLine(types[i].Name +" connect: "+ result);
}
}
}
解释:
如果你检查“serviceprovider”中的所有服务,你会发现c1和c2不是从“DbContext”实现的,所以你无法直接从服务中通过“DbContext”找到它们。但你可以从组装中得到它们。 (与“IFruit”中的“apple”工具不同)。