【发布时间】:2022-02-01 01:31:50
【问题描述】:
我正在开发 xamarin 项目并使用 Entity Framework Core 访问数据库。我知道这不是一个好的解决方案,但我决定不使用应用程序服务器。
DAL 层使用存储库模式,BL 层使用带有映射器的外观模式。 在 DAL 层上,我想创建实体的 IAsyncEnumerable,在 BL 上,我想创建模型的 IAsyncEnumerable。
第一个和第二个示例不起作用,它以 System.ObjectDisposedException “无法访问已释放的上下文实例...”结束,为什么? ToList() 效果很好,ToListAsync() 效果很好。
以 System.ObjectDisposedException 结束
public IAsyncEnumerable<TaskEntity> GetTasksByTaskGroupIdAndKanbanStateAsync(Guid taskGroupId, string kanbanStateName, CancellationToken token)
{
using (WorkManagerDbContext dbContext = IdbContextFactory.CreateDbContext())
{
return dbContext.TaskSet.AsQueryable().Where(s => s.TaskGroup.Id == taskGroupId)
.Where(s => s.State.Name == kanbanStateName).ToAsyncEnumerable();
}
}
以 System.ObjectDisposedException 结束
public IAsyncEnumerable<TaskEntity> GetTasksByTaskGroupIdAndKanbanStateAsync(Guid taskGroupId, string kanbanStateName, CancellationToken token)
{
using (WorkManagerDbContext dbContext = IdbContextFactory.CreateDbContext())
{
return dbContext.TaskSet.AsQueryable().Where(s => s.TaskGroup.Id == taskGroupId).
Where(s => s.State.Name == kanbanStateName).AsAsyncEnumerable();
}
}
工作解决方案,但我不知道它是否是好的解决方案。
public IAsyncEnumerable<TaskEntity> GetTasksByTaskGroupIdAndKanbanStateAsync(Guid taskGroupId, string kanbanStateName, CancellationToken token)
{
using (WorkManagerDbContext dbContext = IdbContextFactory.CreateDbContext())
{
return dbContext.TaskSet.AsQueryable().Where(s => s.TaskGroup.Id == taskGroupId)
.Where(s => s.State.Name == kanbanStateName).ToList().ToAsyncEnumerable();
}
}
【问题讨论】:
-
您在
using子句中构建它们,然后将它们从其中返回,这会在集合实际水合之前处理上下文对象。 -
使 WorkManagerDbContext 限定在容器内,然后删除 using 语句。
标签: c# asynchronous entity-framework-core repository-pattern iasyncenumerable