【发布时间】:2021-10-09 19:02:53
【问题描述】:
现在已经研究了几个小时,即使在网上搜索了其他解决方案后,我仍然无法理解/解决这个错误!
我有一个 Blazor 应用程序,我想在初始化索引页面时通过 DI 服务加载数据。以下是我的代码的摘要版本:
Startup.cs
...
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DbContext")));
...
services.AddTransient<IMyDbService, MyDbService>();
...
DbContext.cs
public class MyDbContext : DbContext
{
public MyDbContext() { }
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }
public virtual DbSet<Item> Items { get; set; }
}
IMyDbService.cs
public class MyDbService : IMyDbService
{
private MyDbContext MyDbContext { get; set; }
public MyDbService (MyDbContext myDbContext)
{
MyDbContext = myDbContext;
}
public async Task<IEnumerable<Item>> Get()
{
var result = await MyDbContext.Items
.Include(i => i.Log)
.ToListAsync();
return result;
}
}
最后在内部调用
Index.razor.cs
public partial class Index
{
[Inject]
protected IMyDbService MyDbService { get; set; }
public Dashboard Dashboard { get; set; } = new Dashboard();
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
Dashboard.Items = await MyDbService.Get();
}
}
我浏览了代码,在 LINQ 查询中抛出了异常
var result = await MyDbContext.Items
.Include(i => i.Log)
.ToListAsync();
我试过了:
- 阅读 blazor 文档
- 删除 .Include(...) - 相同的错误
- 添加了在同一方法中执行同步调用的调试代码 -
var t = MyDbContext.Items.Include(i => i.Log).ToList();。 这行得通 - 想着这个问题睡觉,第二天醒来 - 同样的错误。
我一定是忽略了什么?
编辑 感谢 Henk Holterman,意识到异常堆栈消息显示了一个 .Where() 被调用...通过遵循代码,它正在索引组件视图中被调用。还用更准确的代码更新了 index.razor.cs。
<div class="row text-center">
<div class="col">
...
<h4>@Dashboard.Items.Where(x => x.Status == ItemStatus.New).Count()</h4>
...
</div>
</div>
</div>
【问题讨论】:
-
更改私有 MyDbContext MyDbContext { get;放; } to private readonly MyDbContext MyDbContext 并让注入器设置它
-
@GHDevOps 将
private MyDbContext MyDbContext { get; set; }更改为private readonly MyDbContext MyDbContext;会出现相同的错误。 -
堆栈跟踪表明错误在
.Where()中。发布的代码中没有.Where()。因此,您发布了错误的代码。 -
@HenkHolterman 也有同样的想法,但由于跨过断点立即返回异常而感到困惑。但是您提示我在索引页面上使用 .Where() 剥离一些组件,错误消失了!谢谢。将使用我的索引页面中的答案和附加代码更新这篇文章。
-
Items 类是什么样的?您是在该构造函数中还是在代码中的其他位置初始化 Log 实例?
标签: c# asynchronous blazor blazor-server-side .net-5