bor*_*sdj 43 connection-string appsettings asp.net-core
我在NET Core2.0 App中有以下类.
// required when local database does not exist or was deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
public AppContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
return new AppContext(builder.Options);
}
}
Run Code Online (Sandbox Code Playgroud)
当Database不存在时,在Core 2.0中需要进行迁移,并且必须在运行update-database时创建.
升级到ASP.NET Core 2.0后无法创建迁移
我想在2个地方(这里和appsettings.json)没有ConnectionString,但只在.json,所以我试图更换
"Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true"
Run Code Online (Sandbox Code Playgroud)
同
ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString
Run Code Online (Sandbox Code Playgroud)
但它不起作用,我得到空值.
更新1:
请注意,在Core 2中明确添加.json是不必要的,所以问题不在于文件.
https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/
更新2:
此外,我已经使用Configuration从.json向Context发送ConnectionString:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不能将它用于ToDoContextFactory,因为它没有配置,并且迁移使用ToDoContextFactory,因此App根本没有运行.
解决方案:基于@JRB的答案,我使它的工作方式如下:
public AppContext CreateDbContext(string[] args)
{
string projectPath = AppDomain.CurrentDomain.BaseDirectory.Split(new String[] { @"bin\" }, StringSplitOptions.None)[0];
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(projectPath)
.AddJsonFile("appsettings.json")
.Build();
string connectionString = configuration.GetConnectionString("DefaultConnection");
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer(connectionString);
return new AppContext(builder.Options);
}
Run Code Online (Sandbox Code Playgroud)
JRB*_*JRB 59
第1步:在OnConfiguring()中包含以下内容
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
.AddJsonFile("appsettings.json")
.Build();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
}
Run Code Online (Sandbox Code Playgroud)
第2步:创建appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=YOURSERVERNAME; Database=YOURDATABASENAME; Trusted_Connection=True; MultipleActiveResultSets=true"
}
}
Run Code Online (Sandbox Code Playgroud)
第3步:将appsettings.json硬拷贝到正确的目录
Hard copy appsettings.json.config to the directory specified in the AppDomain.CurrentDomain.BaseDirectory directory.
Use your debugger to find out which directory that is.
Run Code Online (Sandbox Code Playgroud)
假设:您已经在项目中包含了Microsoft.Extensions.Configuration.Json(从Nuget获取)包.
上面的解决方案和 Microsoft 文档中都缺少一些东西。如果您按照上述文档中链接的 GitHub 存储库的链接进行操作,您将找到真正的解决方案。
我认为混淆在于许多人使用的默认模板不包含启动的默认构造函数,因此人们不一定知道注入的配置来自哪里。
因此,在 Startup.cs 中,添加:
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
Run Code Online (Sandbox Code Playgroud)
然后在 ConfigureServices 方法中添加其他人所说的...
services.AddDbContext<ChromeContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DatabaseConnection")));
Run Code Online (Sandbox Code Playgroud)
你还必须确保你已经创建了 appsettings.json 文件并且有一个与此类似的连接字符串部分
{
"ConnectionStrings": {
"DatabaseConnection": "Server=MyServer;Database=MyDatabase;Persist Security Info=True;User ID=SA;Password=PASSWORD;MultipleActiveResultSets=True;"
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您必须对其进行编辑以反映您的配置。
要记住的事情。这是在 .Net Standard 2.1 项目中使用 Entity Framework Core 3 测试的。我需要为以下项目添加 nuget 包:Microsoft.EntityFrameworkCore 3.0.0 Microsoft.EntityFrameworkCore.SqlServer 3.0.0,因为这是我正在使用的,也是访问 UseSqlServer 所需的。
我知道这已被标记为已回答,但是当我在一个项目中工作时遇到了一些问题,我的EF Core 数据访问层位于 .DLL 项目中,与项目的其余部分、API、Auth 和Web 并且大多会喜欢我的其他项目来引用这个数据项目。而且我不想每次都进入Data项目更改连接字符串。
步骤 1:将其包含在 OnConfiguring 方法中
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
IConfigurationRoot configuration = new ConfigurationBuilder()
**.SetBasePath(Path.Combine(Directory.GetCurrentDirectory()))**
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile($"appsettings.{envName}.json", optional: false)
.Build();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
}
Run Code Online (Sandbox Code Playgroud)
注意: .SetBasePath(Path.Combine(Directory.GetCurrentDirectory())) 这将否定或使将文件复制到目录的需要无效,因为 ASP.NET CORE 足够聪明,可以选择正确的文件。假设选择了 Prod 环境文件,指定的环境也会在为发布或生产构建时选择正确的文件。
第 2 步:创建 appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=YOURSERVERNAME; Database=YOURDATABASENAME; Trusted_Connection=True; MultipleActiveResultSets=true"
}
Run Code Online (Sandbox Code Playgroud)
}
请:参考:Microsoft.Extensions.Configuration
如果您使用“顶级语句”,您可以按如下方式获取连接字符串:
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
Run Code Online (Sandbox Code Playgroud)
将它作为 dp 注入传递给该类怎么样?在配置服务中:
services.Configure<MyOptions>(Configuration);
Run Code Online (Sandbox Code Playgroud)
创建类来保存 json 字符串:
public class MyOptions
{
public MyOptions()
{
}
public string Option1 { get; set; }
public string Option2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
将字符串添加到 json 文件:
"option1": "somestring",
"option2": "someothersecretstring"
Run Code Online (Sandbox Code Playgroud)
在需要这些字符串的类中,作为构造函数传入:
public class SomeClass
{
private readonly MyOptions _options;
public SomeClass(IOptions<MyOptions> options)
{
_options = options.Value;
}
public void UseStrings()
{
var option1 = _options.Option1;
var option2 = _options.Option2;
//code
}
}
Run Code Online (Sandbox Code Playgroud)
在ASPNET Core中,您可以在 Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}
Run Code Online (Sandbox Code Playgroud)
您的连接在哪里定义 appsettings.json
{
"ConnectionStrings": {
"BloggingDatabase": "..."
},
}
Run Code Online (Sandbox Code Playgroud)
来自MS docs的示例
| 归档时间: |
|
| 查看次数: |
104485 次 |
| 最近记录: |