我有一个具有两个数据库连接的Visual Studio解决方案。第一个是包含用户名密码和数据库的目录。第二个是用户数据。我可以在“ ConfigureServices”中设置目录数据库的连接,这很好。用户尝试登录并成功后,我便可以知道用户将连接到的数据库。
我的问题是,启动后如何创建服务。如何在正常操作过程中使用连接字符串添加DBcontext。根据我的搜索,如果您知道启动时的连接字符串,则可以。
var connection = @"Server=(localdb)\mssqllocaldb;Database=JobsLedgerDB;Trusted_Connection=True;ConnectRetryCount=0";
services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));
但是,如果我在启动时没有连接字符串...当我终于有了连接字符串时,如何在项目已经启动并运行后添加服务?
答案 0 :(得分:2)
Tolbxela的另一种答案建议在需要时在需要的地方创建一个新的上下文,但是如果您要使用依赖注入,那将不起作用。相反,您应该使用ConfigureServices
扩展方法在Startup
类的AddDbContext
方法的 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
...
services.AddDbContext<BloggingContext>(options =>
{
var customerId = serviceProvider.GetService<IHttpContextAccessor>().HttpContext?.User?.FindFirst("customerId")?.Value;
var connectionString =
$"bla blah blah ;Initial Catalog={customerId}";
options.UseSqlServer(connectionString);
方法中提供像这样的工厂,如Camilo在该答案的注释中所述:
FindFirst
在此示例中,初始目录设置为声明“ customerId”的值。 (public class MyController : Controller
{
public MyController(BloggingContext context)
{
...
}
};
是我自己编写的自定义扩展方法)。这个例子只是让您对这种方法有所了解。
然后,您可以像平常一样插入上下文:
{{1}}
答案 1 :(得分:0)
您可以在应用程序的每个类中实例化DbContext。
示例
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Data Source=blog.db");
using (var context = new BloggingContext(optionsBuilder.Options))
{
// do stuff
}
对于您的SQL连接
var connection = @"Server=(localdb)\mssqllocaldb;Database=JobsLedgerDB;Trusted_Connection=True;ConnectRetryCount=0";
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlServer(connection);
using (var context = new BloggingContext(optionsBuilder.Options))
{
// do stuff
}