首页 > 解决方案 > 在 EF 上下文中使用 appsettings.json 配置

问题描述

我应该指出我是 .NET 的新手......

我有以下 appsettings.json 文件:

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "ConnectionStrings": {
        "MyContext": "Host=localhost;Database=test;Username=user;Password=''"
    }
}

在 MyContext.cs 文件中,我想从 appsettings.json 配置中读取连接字符串:

using Microsoft.EntityFrameworkCore;
using System;
using System.Configuration;

namespace My.Models
{
  public partial class MyContext : DbContext
  {

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
    Console.WriteLine(ConfigurationManager.ConnectionStrings.Count);
    if (!optionsBuilder.IsConfigured)
    {
  optionsBuilder.UseNpgsql(ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString);
    }
  }
}

但是ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString是空的,任何想法为什么?

我在 Startup.cs via 中成功使用了配置文件Configuration.GetConnectionString("MyContext"),但是在这里我想从这个配置中读取连接字符串以用于 ASP.NET 应用程序之外的情况(即在我想做的 EF 迁移中using var db = new MyContext();),但不知道为什么上面返回null。

ConfigurationManager 不是从我的 appsettings.json 文件中读取吗?不知道如何判断,因为ConfigurationManager.ConnectionStrings.Count返回 1,所以我很困惑。有什么明显的错误有人可以看到吗?

我正在使用 .NET Core 5 和 EF Core 版本 5

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

解决方案


在 ef core 中定义连接字符串的常用方法是

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql(@"Host=localhost;Database=test;Username=user;Password=password");
}

您可以手动访问 IConfiguration:

  1. 将此软件包安装到 ef 项目中
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
  1. 构建 IConfiguration
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
            .AddJsonFile("appsettings.json")
            .Build();
        optionsBuilder.UseNpgsql(configuration.GetConnectionString("DefaultConnection"));
    }

如果你的 Ef 核心在一个特殊的项目中,你必须将 appsetings.json 复制到这个项目中

如果您在查找 appsettings 文件夹时遇到问题,您可以直接定义路径

// .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
   .AddJsonFile(@"C:\....\appsettings.json")

推荐阅读