首页 > 解决方案 > 异常:ObjectContext 实例已被释放,不能再用于需要连接的操作

问题描述

我的项目设置了一个 CQRS 框架,该框架调用如下命令:

using (var transaction = dbContext.Database.BeginTransaction())
{
    var command =
        _container.Resolve<IBusinessCommand<TData, TResult>>(
            new TypedParameter(typeof(IHoneyBeeDbContext), dbContext));
                
        var result = await command.ExecuteAsync(data, token);

        await dbContext.SaveChangesAsync();
        transaction.Commit();

        return result;
}

command.ExecuteAsync 函数调用下面的命令函数:

public class CreateMultiScoCourseCommand : IBusinessCommand<CreateMultiScoCourseCommandRequest, CommandResult>
{
    private readonly IClock _clock;
    private readonly IHoneyBeeDbContext _dbContext;        

    public CreateMultiScoCourseCommand(IClock clock, IHoneyBeeDbContext dbContext)
    {
        _clock = clock;
        _dbContext = dbContext;         
    }

    public async Task<CommandResult> ExecuteAsync(CreateMultiScoCourseCommandRequest request, CancellationToken token)
    {
        var estimatedTimeSpan = new TimeSpan(0, request.EstimatedTimeHours, request.EstimatedTimeMinutes, 0);
        var newCourse = new Course
        {
            CreateDate = _clock.UtcNow,
            CreateUser = request.CurrentUserId,
            Active = true,
            Name = request.Name,
            DisplayName = request.DisplayName,
            Description = request.Description,
            OnlineOnly = request.OnlineOnly,
            EstimatedTime = (int)estimatedTimeSpan.TotalSeconds,              
            IsMultiSco = true,
            ImportID = request.ImportId,
            PreviewImportID = request.PreviewImportId,
            PreviewFilePath = request.PreviewFilePath,
            FilePath = request.FilePath,
            MarketTypeID = request.MarketTypeId.GetValueOrDefault(),
            Thumbnail = request.Thumbnail,
            ThumbnailFilename = request.ThumbnailFilename,
            CEU = request.CEU,
            TemplateID = request.TemplateId,
            MinimumScore = request.MinimumScore,
            ViewPeriod = request.ViewPeriod,
            LanguageID = request.LanguageId.GetValueOrDefault()
        };

        _dbContext.Courses.Add(newCourse);

        return CommandResult.WithSuccess();
    }
}

传入的请求本质上是表单上的条目。

完成命令后,它会返回事务以完成 SaveChancesAsync() 调用并将其提交到数据库。

我们有几个使用相同工作流程的命令,除了这个之外,所有这些都可以正常工作。对于这个,当它执行 SaveChangesAsync() 时,它会抛出以下错误:

ObjectContext 实例已被释放,不能再用于需要连接的操作

我为这个错误做了一些广泛的谷歌搜索,我在研究中看到的几乎实例是人们谈论 EntityFramework 如何进行延迟加载,并且人们在他们的 LINQ 查询中缺少一些 .Include(x => x.SomeEntity) 语句。显然,情况并非如此,因为我没有对这个特定命令执行任何 LINQ。

我在 SaveChangesAsync() 提交上方放置了一些 ChangeTracking 语句,以验证 Course 对象是唯一在 dbContext 上添加/修改的对象,情况就是如此。

这个命令以前工作过,我只是做了更新以符合一些命名和访问修饰符约定,现在突然间我收到了这个错误。

有谁知道这可能是什么?

标签: c#.netentity-frameworkcqrs

解决方案


推荐阅读