在单例中使用 EF 6 读取数据 Class

Reading data with EF 6 in a Singleton Class

我正在开发 .Net 6 API,它使用服务层来执行控制器的所有业务逻辑。我正在尝试使用“using”语句在此层上使用 EF 6,以便能够在 Singleton class 中使用 de dbContext。问题是,一旦完成所有逻辑并且控制器正在映射对象,我就会收到“处置对象”错误。

服务方式


        public async Task<StudiesResponse> GetAllStudies()
        {
            StudiesResponse studies = new StudiesResponse();
            List<StudyReponse> list = new List<StudyReponse>();
            StudyReponse resp;
            try
            {
                using (var scope = _serviceProvider.CreateScope())
                {
                    var _dbContext = scope.ServiceProvider.GetRequiredService<DataContext>();
                    foreach (Study study in _dbContext.Studies)
                    {
                        resp = new StudyReponse()
                        {
                            StudyCode = study.IXRSStudyCode,
                            Participators =  _dbContext.RoleUsers.Where(x => x.Study.StudyId == study.StudyId).Select(x => new ParticipatorsResponse()
                            {
                                UserEmail = x.User.UserEmail, 
                                RoleName = x.Role.Name
                            })
                        };
                        list.Add(resp);
                    }
                }
                studies.Studies = list;
            }
            catch (Exception e)
            { throw e; }

            return studies;
        }

我的问题是在“list.Add(resp);”这一行我的参与者列表仍然包含所有数据。但是一旦代码离开 Using,列表变量的 属性 Participators 就是空的......我知道问题是我从 _dbContext 的 LinQ 结果中获取它并且它被处理掉了。但我不知道为什么......我的意思是,我将它分配给一个变量,为什么它不粘?

尝试在 .Select(x => new ParticipatorsResponse() { }) 之后添加 ToList() 以保留 Participators 集合。

这是因为数据是“惰性”的,仅在迭代集合时才检索。

由于您在 using 块之外迭代它(可能是您调用 GetAllStudies() 的地方),连接不再有效。 ToList() 对其进行迭代并存储一个列表而不是 IEnumerable/IQueryable

resp = new StudyReponse()
{
    StudyCode = study.IXRSStudyCode,
    Participators =  _dbContext.RoleUsers.Where(x => x.Study.StudyId == study.StudyId).Select(x => new ParticipatorsResponse()
    {
        UserEmail = x.User.UserEmail, 
        RoleName = x.Role.Name
    }).ToList()
};