【发布时间】:2017-08-08 09:25:49
【问题描述】:
使用 EF Core,我想异步获取具有 ChildModel 集合属性的 FooModel 列表。
public class FooModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<ChildModel> Childs { get; set; }
}
虽然同步版本返回没有问题,但异步版本会导致应用程序冻结。
//Async version.
public static async Task<List<FooModel>> ListFooModelAsync()
{
using (var db = new AppDbContext())
{
var foo_items = await db.Foos
.Include(e => e.Childs)
.Select(e => new FooModel
{
Id = e.Id,
Name = e.Name,
Childs = e.Childs.Select(
child => new ChildModel { Id = child.Id, Name = child.Name })
.ToList()
})
.ToListAsync()
.ConfigureAwait(false);
return foo_items;
}
}
我认为对 Childs 的 ToList() 调用导致管道某处出现死锁。
如果我删除 Childs 构造行中的 .ToList(),它不会冻结并返回 FooModel 列表,但其 Childs 集合的类型将是 Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider。枚举适配器。一旦我尝试在客户端中使用结果,应用程序就会停止响应,这可能是因为 EF 尝试解析 Childs 集合,但此时没有可用的 DbContext。
关于如何解决这个问题的任何想法?
//Sync version works fine.
public static List<FooModel> ListFooModel()
{
using (var db = new AppDbContext())
{
var foo_items = db.Foos
.Include(e => e.Childs)
.Select(e => new FooModel
{
Id = e.Id,
Name = e.Name,
Childs = e.Childs.Select(
child => new ChildModel { Id = child.Id, Name = child.Name })
.ToList()
})
.ToList();
return foo_items;
}
}
【问题讨论】:
标签: c# .net entity-framework asynchronous async-await