我正在尝试创建一个简单的 .NET Core 控制台应用程序,通过 EF Core 访问数据库。无论我做什么,我都无法成功设置我的
Program.cs
来满足任何需要。尝试运行迁移时,我不断收到以下错误:
访问 Microsoft.Extensions.Hosting 时发生错误 服务。在没有应用程序服务提供商的情况下继续。错误: 入口点退出时没有构建 IHost。无法 创建类型为“”的“DbContext”。异常“无法解决” 类型服务 'Microsoft.EntityFrameworkCore.DbContextOptions`1[TestConsoleApp.ApplicationDbContext]' 尝试激活“TestConsoleApp.ApplicationDbContext”时。 尝试创建实例时抛出。对于不同的 设计时支持的模式,请参阅 https://go.microsoft.com/fwlink/?linkid=851728
如果有人想尝试和重现,这里是我正在执行的确切步骤(以及我的确切代码)。请注意,当使用
dotnet new webapi
从头开始创建 Web API 时,这一切都可以正常工作。
我正在运行以下命令来创建新的 .NET Core 8 控制台应用程序:
dotnet new console -n ConsoleApp
我安装了以下 NuGet 包:
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="8.0.2" />
然后,我创建一个
Entities
文件夹并向其中添加一个简单的 Product.cs
实体。
然后我创建一个
Data
文件夹并向其中添加一个 ApplicationDbContext
,如下所示:
public class ApplicationDbContext
{
public
ApplicationDbContext(DbContextOptions选项):基(选项) { }
public DbSet<Product> Products { get; set; }
}
然后在我的
Program.cs
中我正在执行以下操作:
var services = new ServiceCollection();
// Add DbContext configuration
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlite("Data Source=App.db");
});
// Build the service provider
using (var serviceProvider = services.BuildServiceProvider())
{
// Resolve the DbContext from the service provider
var dbContext = serviceProvider.GetRequiredService<ApplicationDbContext>();
Console.WriteLine("Hello, World!");
}
然后,我尝试从项目的根目录运行以下命令:
dotnet ef migrations add InitialCreate -o Data/Migrations
错误消息表明应用程序无法构建
IHost
或 IWebHost
的实例。也许我在控制台应用程序的 Program.cs
中所做的并不能满足这个要求?
我从 Program.cs 中删除了所有内容,并将以下内容直接添加到 DbContext 中:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=MyApp.db");
}
迁移实际上已经创建,并且一切似乎都在进行。但是,我仍然收到黄色警告/错误:“访问 Microsoft.Extensions.Hosting 服务时发生错误。在没有应用程序服务提供商的情况下继续。错误:入口点退出而没有构建 IHost。”
如果我添加 Console.ReadLine();到 Program.cs 时,调用 dotnet ef add migrations 命令会创建迁移,控制台应用程序保持正常运行,然后当我使用 ctrl+c 关闭它时,会出现相同的黄色警告/错误。我假设这是一个无害的错误。
我真的希望能够将我的 DbContext 放在一个中心位置,以便 WebAPI 或 ConsoleApp 可以访问它。这里的问题是 WebAPI 可以完成上下文选项注入,但控制台应用程序不能。
要使
.Net core
控制台应用程序与 Entity Framework Core
控制台应用程序一起使用,需要与 Microsoft.Extensions.Hosting
的通用主机一起使用。
有关如何实现通用主机的示例可以在 David Federman 的博客 post 中找到