gpt4 book ai didi

c# - 查询在模拟 Dbcontext 上为 null 的实体关系

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:20 24 4
gpt4 key购买 nike

我正在使用 Microsoft docs用于 mock DbContext .我在查询 IOrderedQueryable 时遇到问题那是空的。

var report = new Report();
report.DataSource = null;
var q = context.Reports.Select(x => x.DataSource).OrderBy(x => x.Name);
var results = q.ToList();

当我调用 ToList , 它会在 TestDbAsyncEnumerator.MoveNextAsync 中抛出错误在这条线上

return Task.FromResult(_inner.MoveNext())

错误:

System.AggregateException: One or more errors occurred.
System.NullReferenceException: Object reference not set to an instance of an object.

at lambda_method(Closure, Experience)
at System.Linq.EnumerableSorter2.ComputeKeys(TElement[] elements, Int32
count)<br/>
at System.Linq.EnumerableSorter
1.Sort(TElement[] elements, Int32 count)
at System.Linq.OrderedEnumerable1.<GetEnumerator>d__1.MoveNext()<br/>
at S360.Tests.TestDbAsyncEnumerator
1.MoveNextAsync(CancellationToken cancellationToken)

如果我删除 OrderByOrderBy x => 0一切正常。我如何模拟的任何解决方案 DbContext这样我的查询就不会抛出任何异常?

最佳答案

请参阅 Microsoft 文档中的 EF 内存中测试替身的限制

当您在 Select() 中投影到 .DataSource 时,它很可能为 null,这会在您尝试访问 时导致 NullReferenceException。 OrderBy() 中的名称

当您对数据库执行此查询时,EF 将看到对 DataSource 导航属性的访问,并包含一个 JOIN 以便获取它。

在内存中执行时,不会发生此连接。

您可以将预期的 DataSource 实体添加到测试设置中的 Reports 实体,或者更好的是使用 Effort in-memory provider ,它将填充导航属性,就像真实的数据库一样。

关于c# - 查询在模拟 Dbcontext 上为 null 的实体关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47033456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com