【发布时间】:2019-05-17 14:28:05
【问题描述】:
我在 Ubuntu 机器上使用 MVC 框架编写了我的第一个 .Net 核心程序。在程序中,我试图与 SQLite 数据库进行交互。当通过控制器类进行处理时,数据库 CRUD 操作可以正常工作。但是,当我尝试对控制器外部的数据库进行操作时,出现以下错误
"未处理的异常:System.ObjectDisposedException: 无法访问已释放的对象。此错误的常见原因是释放从依赖注入中解析的上下文然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果您使用依赖注入,则应该让依赖注入容器负责处理上下文实例。 对象名称: 'MyDbContext'。"
对于控制器类之外的操作,我创建了一个名为MyDbWatch.cs的类(在项目根目录中)
public interface IMyDbWatch { }
public class MyDbWatch : IMyDbWatch
{
private readonly MyDbContext _dbContext;
private static Timer _timer;
private AutoResetEvent _autoEvent = null;
public MyDbWatch(MyDbContext context)
{
_dbContext = context;
_autoEvent = new AutoResetEvent(false);
_timer = new Timer(
callback: async s => await OnTimerEventAsync(s),
state: _autoEvent,
dueTime: 5000,
period: 10000);
}
public async Task OnTimerEventAsync(Object stateInfo)
{
Console.WriteLine("retreiving from db - 1");
var ienStates = from m in _dbContext.IenState select m;
Console.WriteLine("retreiving from db - 2");
var listdb = await ienStates.ToListAsync();
Console.WriteLine("retreiving from db - 3");
}
}
这里我如何在 Startup.cs 文件中注入不同的依赖项
public class Startup
{
private MyDbWatch _myDbWatch;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<IpointWebMcmContext>(options =>
options.UseSqlite(Configuration.GetConnectionString("IpointContext")));
services.AddScoped<IMyDbWatch, MyDbWatch>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
IMyDbWatch dbwatch)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
_myDbWatch = dbwatch;
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
MyDbWatch.cs 中的定时器回调函数 OnTimerEventAsync 首次被调用,并且调试文本“rereiving from db - 1”被打印在控制台中。之后我得到错误
未处理的异常:System.ObjectDisposedException:无法访问已处置的对象...。
我们将不胜感激任何解决此问题的帮助。我需要数据库上的这种手表,通过使用 SignalR hub 框架(尚未包含在代码中)将数据推送到客户端。
【问题讨论】:
标签: asp.net .net entity-framework asp.net-core-mvc