在单例中使用 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()
};
我正在开发 .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()
};