C# System.ObjectDisposedException-代码在我将其移动到另一个方法之前一直有效
我已经查看了错误消息,我发现的所有问题都与EF基础设施的一般设置有关,不管怎样。我找不到一个谈论任何与基础设施无关的东西 你知道为什么把代码移到另一个方法会破坏它吗 编辑 上下文在示例文档的样板文件C# System.ObjectDisposedException-代码在我将其移动到另一个方法之前一直有效,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,我已经查看了错误消息,我发现的所有问题都与EF基础设施的一般设置有关,不管怎样。我找不到一个谈论任何与基础设施无关的东西 你知道为什么把代码移到另一个方法会破坏它吗 编辑 上下文在示例文档的样板文件ConfigureServices中进行了初始化 public class MyOtherModel { [ForeignKey("ID")] public int ID { get; set; } [ForeignKey("TitleID")] public in
ConfigureServices
中进行了初始化
public class MyOtherModel {
[ForeignKey("ID")]
public int ID { get; set; }
[ForeignKey("TitleID")]
public int? TitleID { get; set; }
public virtual LookUp Title { get; set; }
public void配置服务(IServiceCollection服务){
services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(“MyModel”));
这很有效
public void ConfigureServices(IServiceCollection services) {
services.AddDbContext<MyContextModel>(options => options.UseSqlServer(Configuration.GetConnectionString("MyModel")));
PostAsync上的公共异步任务({
MyModel objRecord=新的MyModel();
objRecord.ID=42;
objRecord.Name=“Dave”;
_上下文。案例投诉人。添加(objRecord);
wait_context.SaveChangesAsync();
List lstRecord=新列表();
lstRecord=wait_context.MyOthers
.Include(p=>p.Title)
.Where(n=>n.MyOtherID==objRecord.ID)
.ToListAsync();
这并不重要
public async Task<IActionResult> OnPostAsync({
MyModel objRecord = new MyModel();
objRecord.ID = 42;
objRecord.Name = "Dave";
_context.CaseComplainants.Add(objRecord);
await _context.SaveChangesAsync();
List<MyOtherModel> lstRecord = new List<MyOtherModel>();
lstRecord = await _context.MyOthers
.Include(p => p.Title)
.Where(n => n.MyOtherID == objRecord.ID)
.ToListAsync();
PostAsync上的公共异步任务({
MyModel objRecord=新的MyModel();
objRecord.ID=42;
objRecord.Name=“Dave”;
_上下文。案例投诉人。添加(objRecord);
wait_context.SaveChangesAsync();
DoStuff(objRecord.ID);
}
专用异步void DoStuff(int-TheID){
List lstRecord=新列表();
lstRecord=wait_context.MyOthers
.Include(p=>p.Title)
.其中(n=>n.MyOtherID==TheID)
.ToListAsync();
了解如何创建和存储上下文会很有用。例外情况是,它已被处理。胡佛并不总是有用的,因为处理调试器的行为有时与实际运行的代码不同。至少,您必须检查“IsDisposed”属性,如果它存在的话。对对象的引用根本不会因为Disposing而改变。Disposing只是指“不再使用”。如果您以后尝试使用它,它会抱怨。该项目完全是样板,没有任何花哨的东西直接来自示例代码和文档。如果有帮助,我添加了
ConfigureServices
。我在整个项目的方法中使用\u context
,没有问题,但在本例中,将代码放在一个单独的me中thod导致错误。您确定原始代码是异步运行的吗,因为如果调用方法不支持异步,这将同步运行。需要更多信息来查看问题。是的,我已将标题行添加到问题中,以查看您是否正在等待帮助DoStuff
。可能是OnPostAsync
返回可以执行DoStuff
之前的。发生这种情况时,将释放上下文,然后运行DoStuff
并获得异常。请尝试等待DoStuff(objRecord.ID)
。
public async Task<IActionResult> OnPostAsync({
MyModel objRecord = new MyModel();
objRecord.ID = 42;
objRecord.Name = "Dave";
_context.CaseComplainants.Add(objRecord);
await _context.SaveChangesAsync();
List<MyOtherModel> lstRecord = new List<MyOtherModel>();
lstRecord = await _context.MyOthers
.Include(p => p.Title)
.Where(n => n.MyOtherID == objRecord.ID)
.ToListAsync();
public async Task<IActionResult> OnPostAsync({
MyModel objRecord = new MyModel();
objRecord.ID = 42;
objRecord.Name = "Dave";
_context.CaseComplainants.Add(objRecord);
await _context.SaveChangesAsync();
DoStuff(objRecord.ID);
}
private async void DoStuff(int TheID) {
List<MyOtherModel> lstRecord = new List<MyOtherModel>();
lstRecord = await _context.MyOthers
.Include(p => p.Title)
.Where(n => n.MyOtherID == TheID)
.ToListAsync();