![](/img/trans.png)
[英]System.ObjectDisposedException: 'Cannot access a disposed object.'
[英]System.ObjectDisposedException: Cannot access a disposed object. AplicationDbContext
我调用GetSurveysAuditorByUserEmail方法。 此方法连接到另一个远程数据库并返回记录。
public SurveysService(ApplicationDbContext context) {
_context = context;
}
public IList<Survey> GetSurveysAuditorByUserEmail(string email) {
var idsSurveys = new List<string>( );
var surveys = new List<Survey>( );
try {
using(IDbConnection db = new SqlConnection(_connStringAudit)) {
idsSurveys = db.Query<string>("Select (CONVERT(nvarchar(450), Id) + Funz) as IdRilievo From V_TemView Where Email = @email",
new { email }).ToList( );
}
surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList( );
}
catch (Exception e) {
_logger.Write(e.Message);
}
return surveys;
}
在线surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList();
我得到错误:
System.ObjectDisposedException:无法访问已处置的对象。 导致此错误的常见原因是,处理从依赖项注入中解决的上下文,然后稍后尝试在应用程序中的其他位置使用相同的上下文实例。 当您在上下文上调用Dispose()或将上下文包装在using语句中时,可能会发生这种情况。 如果使用依赖项注入,则应让依赖项注入容器负责处理上下文实例。 对象名称:“ ApplicationDbContext”。
编辑 :
我在另一个类中调用此方法:
public async Task<List<IGrouping<int, Survey>>> GroupSurveyByIntervId(User user) {
IList<Survey> surveys = new List<Survey>( );
var statuses = _context.Statuses.ToList( );
//var surv = _context.Surveys.ToList();
var userRoles = await _userManager.GetRolesAsync(user);
surveys = _surveysService.GetSurveysAuditorByUserEmail(user.Email);
var groupSurv = surveys.GroupBy(x => x.InterventionId).ToList( );
return groupSurv;
}
编辑
我在Startup.cs
注入ApplicationDbContext:
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<TrackingUser, TrackingRole>(options => {
options.SignIn.RequireConfirmedEmail = false;
})
.AddEntityFrameworkStores<ApplicationDbContext>( );
我该如何解决? 谢谢
surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList();
您正在尝试在using块之外使用它。 像这样做
using (IDbConnection db = new SqlConnection(_connStringAudit))
{
idsSurveys = db.Query<string>("Select (CONVERT(nvarchar(450), Id) + Funz) as IdRilievo From V_TemView Where Email = @email",
new { email }).ToList();
surveys = _context.Surveys.Where(o => idsSurveys.Contains(o.Id)).ToList();
}
db被放置在using块之外,查询对象也被放置在该块之外。
很少有澄清:如果您使用的是实体框架核心,请不要使用单独的dbconnection。 如果要连接到两个不同的数据库,请使用不同的DataContext。
不要打开与同一数据库的Parellal连接。 它强制现有连接关闭。
如果是同一数据库,并且您正在使用代码优先迁移,
在DBContext
类中,添加DBSet<IdRilievo>
属性,并从同一上下文对象访问它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.