我正在使用.NET Core 2.1和Entity Framework制作一个n层MVC应用程序。此外,我的应用程序还作为客户端侦听托管的MQTT队列。我还利用了Dependency Injection。这很完美,直到将消息推送到队列并想将该消息保存到数据库时。一旦发生这种情况,我就会收到以下ObjectDisposedException错误消息:
“无法访问已释放的对象。此错误的常见原因是处理从依赖性注入解析并稍后在应用程序的其他位置尝试使用相同上下文实例的上下文。如果您正在调用Dispose()上下文,则可能会发生这种情况,或者包装上下文在using语句中。如果您正在使用依赖项注入,则应让依赖项注入容器处理上下文实例的处理。对象名称:'xxxDbContext'。”
我可以点击“继续”,之后应用程序就会继续工作。他只会在第一个从队列收到的消息上抛出异常。控制器/管理器/存储库的每个其他操作都可以正常运行。我的代码如下:
经理直接将其发送到存储库,出现错误消息。
我已经阅读了this,但这些情况似乎都不适用于我。当我在
有人有解决方法或者我可以搜索解决方法的地方吗?
提前致谢!
“无法访问已释放的对象。此错误的常见原因是处理从依赖性注入解析并稍后在应用程序的其他位置尝试使用相同上下文实例的上下文。如果您正在调用Dispose()上下文,则可能会发生这种情况,或者包装上下文在using语句中。如果您正在使用依赖项注入,则应让依赖项注入容器处理上下文实例的处理。对象名称:'xxxDbContext'。”
我可以点击“继续”,之后应用程序就会继续工作。他只会在第一个从队列收到的消息上抛出异常。控制器/管理器/存储库的每个其他操作都可以正常运行。我的代码如下:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDefaultIdentity<User>()
.AddEntityFrameworkStores<xxxDbContext>();
services.AddDbContext<xxxDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")
));
// Some identity configuration omitted here
services.AddScoped<IIdeationRepository, IdeationRepository>();
services.AddScoped<IIdeationManager, IdeationManager>();
// Some other DI configuration omitted as well.
}
public Configure(IApplicationBuilder app, IHostingEnvironment env,
IApplicationLifetime applicationLifetime, IServiceProvider serviceProvider)
{
// Start MQTT
var broker = new MqttBroker(serviceProvider.GetService<IIdeationManager>(),
serviceProvider.GetService<IConfiguration>());
// On application exit terminate MQTT to make sure the connection is ended properly
applicationLifetime.ApplicationStopping.Register(() => broker.Terminate());
// Some default http pipeline code omitted
}
MqttBroker.cs
public MqttBroker(
[FromServices] IIdeationManager ideationManage,
[FromServices] IConfiguration configuration)
{
_ideationManager = ideationManager;
_configuration = configuration;
Initialize();
}
// Some code where I just parse the message and on receive send it to the
// ideation manager, this just works so I omitted it.
}
经理直接将其发送到存储库,出现错误消息。
Repository.cs
private xxxDbContext ctx;
public IdeationRepository(xxxDbContext xxxDbContext)
{
this.ctx = xxxDbContext;
}
// This method crashes with the error
public IdeationReply ReadIdeationReply(int id)
{
return ctx
.IdeationReplies
.Include(r => r.Votes)
.FirstOrDefault(r => r.IdeationReplyId == id);
}
DbContext.cs
public class xxxDbContext : IdentityDbContext<User>
{
public DbSet<Ideation> Ideations { get; set; }
// Some more dbsets omitted
public CityOfIdeasDbContext(DbContextOptions<CityOfIdeasDbContext> options)
: base (options)
{
CityOfIdeasDbInitializer.Initialize(this, dropCreateDatabase: false);
}
// In configuring I just create a logger, nothing special
// In OnModelCreating I just setup some value converters for other tables
// than the ones I need here
internal int CommitChanges()
{
if (delaySave)
{
int infectedRecords = base.SaveChanges();
return infectedRecords;
}
throw new InvalidOperationException(
"No UnitOfWork present, use SaveChanges instead");
}
}
我已经阅读了this,但这些情况似乎都不适用于我。当我在
Dispose()
中打印堆栈跟踪时,它发生在Main()
方法中,所以这并没有真正帮助我。有人有解决方法或者我可以搜索解决方法的地方吗?
提前致谢!
IdeationRepository
并且如何使用它?请展示在Startup.cs
中的服务/仓库注册。 - ingvarSystem.ObjectDisposedException
在哪里发生,请向我们展示这个方法的代码。 - ingvar