【发布时间】:2020-06-10 01:59:40
【问题描述】:
我将我的解决方案拆分为多个项目/层。我使用的技术是 .NET Core 和 Entity Framework Core 中的 C#。
我有一个基础设施项目,它是一个 .NET Core 类库项目,我放置了 DataContext 类。如果我将连接字符串直接放在DataContext 类中,它就可以工作。当我 set as startup project 我的 Web Api 项目时,我可以执行 EF 迁移。
public class DataContext : DbContext
{
const string connectionString = "Server=STEVENGAI\\SQLEXPRESS;Database=CinemaDbNETCore;Trusted_Connection=True;MultipleActiveResultSets=true";
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
AppConfiguration appconfig = new AppConfiguration();
optionsBuilder.UseSqlServer(appconfig.ConnectionString);
}
public DbSet<Movie> Movies { get; set; }
}
但是,我需要将连接字符串放在 appsettings.json 中。所以,我安装了这些包
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.Configuration.Json
并让这个类从 appsettings.json 读取连接字符串。
namespace CinemaApp.NETCore.Infrastructure
{
public class AppConfiguration
{
public readonly string _connectionString = string.Empty;
public AppConfiguration()
{
var configurationBuilder = new ConfigurationBuilder();
var path = Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json");
configurationBuilder.AddJsonFile(path, false);
var root = configurationBuilder.Build();
_connectionString = root.GetSection("ConnectionString").GetSection("CinemaDb").Value;
//var appSetting = root.GetSection("ApplicationSettings");
}
public string ConnectionString
{
get => _connectionString;
}
}
}
然后,我创建另一个 .NET Core 控制台项目来测试我是否可以获得它成功执行的连接字符串。当我 Set as Startup Project 这个控制台测试项目时,我可以执行 EF 迁移。
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
AppConfiguration appconfig = new AppConfiguration();
Console.WriteLine(appconfig.ConnectionString);
Console.WriteLine("Hello World!");
}
}
}
但是,问题是当我将Set as Startup Project 切换回 Web Api 项目并执行 EF 迁移时,它给了我这个错误Value cannot be null. (Parameter 'connectionString')
我已经为控制台测试项目和 Web Api 项目中的 appsettings.json 复制了相同的连接字符串。
【问题讨论】:
-
你能展示你的 Startup.ConfigureServices 吗?你在哪里注册 DataContext ?
-
没有。我没有 Startup.ConfigureServices,因为我使用的是 .NET Core 类库项目,而不是 .NET Core Web 应用程序项目
-
你在
Directory.GetCurrentDirectory()上得到了什么价值? -
@viveknuna 感谢您的指点。我已经发现了这个问题。在我的 web api 项目 appsettings.json 中,我有
"ConnectionStrings"但它实际上检测到没有“s”的连接字符串,"ConnectionString"