运行启动后,DotNet Core设置连接字符串

时间:2019-04-26 11:27:38

标签: c# asp.net-core entity-framework-core

我有一个具有两个数据库连接的Visual Studio解决方案。第一个是包含用户名密码和数据库的目录。第二个是用户数据。我可以在“ ConfigureServices”中设置目录数据库的连接,这很好。用户尝试登录并成功后,我便可以知道用户将连接到的数据库。

我的问题是,启动后如何创建服务。如何在正常操作过程中使用连接字符串添加DBcontext。根据我的搜索,如果您知道启动时的连接字符串,则可以。

var connection = @"Server=(localdb)\mssqllocaldb;Database=JobsLedgerDB;Trusted_Connection=True;ConnectRetryCount=0";
services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));

但是,如果我在启动时没有连接字符串...当我终于有了连接字符串时,如何在项目已经启动并运行后添加服务?

2 个答案:

答案 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。

检查文档:Configuring a 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
}