簡體   English   中英

在 EF 上下文中使用 appsettings.json 配置

[英]Using appsettings.json configuration in EF Context

我應該指出我是 .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為空,有什么想法嗎?

我通過Configuration.GetConnectionString("MyContext")在 Startup.cs 中成功使用了配置文件,但在這里我想從這個配置中讀取連接字符串,用於 ASP.NET 應用程序之外的情況(即在我想要的 EF 遷移中)做using var db = new MyContext(); ),但不知道為什么上面返回 null。

ConfigurationManager 沒有讀取我的 appsettings.json 文件嗎? 不知道如何判斷,因為ConfigurationManager.ConnectionStrings.Count返回 1,所以我很困惑。 有什么明顯錯誤的人可以看到嗎?

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

在 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 核心在一個特殊的項目中,你必須將 appsettings.json 復制到這個項目中

如果您在查找 appsettings 文件夾時遇到問題,可以直接定義路徑

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

我假設您正在運行 API 或 Blazor/Razor 應用程序,因為您提到了Startup.cs文件:)

在這種情況下,建議( 關於此的官方文檔)是使用實體框架自己的庫在Startup.ConfigureServices設置您的MyContext 在那里,您可以訪問應用程序IConfigurationConnectionStrings和允許您使用特定連接字符串注冊DbContext擴展方法。

它可能看起來像這樣,只需將我對Sqlite調用調整為您正在使用的任何數據庫驅動程序:


public class Startup 
{
  Startup(IConfiguration configuration)
  {
    _configuration = configuration;
  }

  void ConfigureServices(IServiceCollection services) 
  {
    // Other dependencies go here
    string connString = _configuration.GetConnectionString("MyContext");
    services.AddDbContext<MyContext>(opt => opt.UseSqlite(connString));
    // Other dependencies, et cetera
  }
}

這允許您防止配置邏輯“泄漏”到您的“模型”命名空間,因此您的MyContext關注點僅與數據的持久性有關,而不是訪問系統文件和環境變量。

為了在控制器上使用MyContext的實例或由 .NET 的依賴注入系統創建的任何其他東西,您需要做的就是在類的構造函數中請求它,例如:

public class MyAwesomeController : ControllerBase
{
  private readonly MyContext _context;

  // This tells .NET to inject an instance of MyContext into your controller
  public MyAwesomeController(MyContext context) 
  {
    _context = context ?? throw new ArgumentNullException();
  }

  // Now all you gotta do is actually use that instance - no matter where it's connecting to
  [HttpGet]
  public Task ListEverything() => _context.MySet.ToListAsync();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM