【发布时间】:2022-01-09 09:17:12
【问题描述】:
我正在尝试在运行BackgroundService 的控制台应用程序中加载相关实体,
但它不加载相关实体,我已经有这个问题几个小时了,我只是注意到它只发生在BackgroundService,通过在索引页面模型中注入 DbContext 类在 Web 应用程序中尝试了相同的DbContext ,没有问题。
这是来自控制台应用程序的代码:
后台服务:
public class MyService : BackgroundService
{
private readonly MyDbContext _context;
public MyService(MyDbContext context)
{
_context = context;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
//Jobs always empty!
var theBatch = _context.Batches.Include(x => x.Jobs).FirstOrDefault();
}
}
程序文件:
class Program
{
static async Task Main(string[] args)
{
using IHost host = CreateHostBuilder(args).Build();
await host.RunAsync();
}
static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
services.AddLogging()
.AddDbContext<MyDbContext>(options => options
.UseSqlServer(context.Configuration.GetConnectionString("MyConnection")))
.AddHostedService<MyService>()
.BuildServiceProvider();
});
}
我正在使用 .NET 5 和 EF Core 5.0.12
【问题讨论】:
-
出于好奇。为什么要构建服务提供商?您是否也尝试过在承包商之外的任何其他地方访问上下文,例如在
Execute中,并且只使用构造函数进行分配? -
不是我需要的东西,未经我通知就复制了!
-
我不明白你的建议,我已经这样做了:我在构造函数中分配了上下文,并在
Execute方法中访问它 -
但是您的示例显示在构造函数中使用包含。你是说即使你在execute中访问Batches也是空的?
-
啊,我明白了。我将编辑器中的代码复制到了错误的地方!
标签: .net-core entity-framework-core eager-loading background-service asp.net-core-hosted-services