【问题标题】:ArgumentNullException: Value cannot be null. (Parameter 'source') When Calling ToListAsync() [duplicate]ArgumentNullException:值不能为空。 (参数'source')调用ToListAsync()时[重复]
【发布时间】: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 =&gt; 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


【解决方案1】:

啊,找到了解决办法! index.razor 中的以下部分触发了异常。第一次加载索引组件时,Dashboard.Items 似乎仍然是null

所以解决方法是替换

<h4>@Dashboard.Items.Where(x => x.Status == ItemStatus.New).Count()</h4>

<h4>@Dashboard.Items?.Where(x => x.Status == ItemStatus.New).Count()</h4>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多