无法访问已处置的对象

时间:2020-08-04 08:45:08

标签: c# asp.net-core entity-framework-core

我正在尝试将一些linq代码更改为sp,但是我的函数之一就是

private async Task getNodes()
{
    List<TreeViewNode> nodes = new List<TreeViewNode>();
    var activities = await _spConnections.GetActiveListBySpAsync(User.Identity.GetCookieUserCompId<int>());

    //Loop and add the Parent Nodes.
    foreach (var activity in activities)
    {
        var model1 = await _activitiesService.GetByIdWithFormsAsync(activity.ID);
        var model = model1.Forms.OrderBy(f => f.Order).ToList();
        var preformid = model1.PreFormId;

        nodes.Add(new TreeViewNode { id = activity.ID.ToString(), parent = "#", text = activity.Name });
        var Forms = await _spConnections.GetSpMainActiveFormListAsync(activity.ID);
        // Loop and add the Child Nodes.
        foreach (var form in Forms)
        {
            DigitalContentEnum enumType = EnumHelper<DigitalContentEnum>.Parse(form.Type);
            string typeName = EnumHelper<DigitalContentEnum>.GetDisplayValue(enumType);

            nodes.Add(new TreeViewNode { id = form.ActivitiesID.ToString() + "-" + form.ID.ToString(), parent = form.ActivitiesID.ToString(), text = form.Title + " <span class='text-danger'>(" + typeName + ") </span> "});
        }

        if (preformid != null)
        {
            var preformtags = await _activitiesService.GetByIdWithPreFormsAsync(preformid);
            var preformModel = preformtags.Forms.OrderBy(x => x.Order).ToList();

            foreach (var foorm in preformModel)
            {
                DigitalContentEnum enumType = EnumHelper<DigitalContentEnum>.Parse(foorm.Type);
                string typeName = EnumHelper<DigitalContentEnum>.GetDisplayValue(enumType);

                nodes.Add(new TreeViewNode { id = foorm.ActivitiesID.ToString() + "-" + foorm.ID.ToString(), parent = model1.ID.ToString(), text = foorm.Title + " <span class='text-danger'>(" + typeName + ") </span> " });
            }
        }
    }

    //Serialize to JSON string.
    var result = JsonConvert.SerializeObject(nodes);
    ViewBag.Json = result;
}

因此,如您所见,通过运行sp来填充var活动,它确实起作用 但是到达时

var model1 = await _activitiesService.GetByIdWithFormsAsync(activity.ID);

错误:

无法访问已处置的对象。导致此错误的常见原因是,处理从依赖项注入中解析出来的上下文,然后稍后尝试在应用程序中的其他位置使用相同的上下文实例。如果在上下文上调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况。如果使用的是依赖项注入,则应让依赖项注入容器负责处理上下文实例。 对象名称:“上下文”。

出现

activitesservice是我的存储库,运行以下内容:

public async Task<Activity> GetByIdWithFormsAsync(long id)
{
    return await _activities.Include(x => x.Forms).FirstOrDefaultAsync(x => x.ID == id);
}

我的sp是:

public async Task<List<Form>> GetSpMainActiveFormListAsync(long actId)
{
    var Check = new List<Form>();
    using (_unitOfWork)
    {
        using (var cmd = _unitOfWork.ExecuteCreateConnection())
        {
            cmd.CommandText = "SpGetMainActiveForm";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            var param1 = cmd.CreateParameter();
            param1.ParameterName = "actId";
            param1.Value = actId;
            cmd.Parameters.Add(param1);

            _unitOfWork.ExecuteOpenConnection();
            using (var result = cmd.ExecuteReader())
            {
                if (result.HasRows)
                {
                    Check = (List<Form>)CommonFunctions.Conversions.MapToList<Form>(result);
                }
            }
            _unitOfWork.ExecuteCloseConnection();
        }
    }
    return Check;
}

UnitOfWork是我的上下文存储库,

public interface IUnitOfWork:IDisposable
{
    EntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
    void MarkAsChanged<TEntity>(TEntity entity) where TEntity : class;
    DbSet<TEntity> Set<TEntity>() where TEntity : class;
    int SaveChanges(bool acceptAllChangesOnSuccess);
    int SaveChanges();
    void ExecuteSqlCommand(string query);
    DbCommand ExecuteCreateConnection();
    void ExecuteOpenConnection();
    void ExecuteCloseConnection();
    void ExecuteSqlCommand(string query, params object[] parameters);
    Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken());
    Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken());
}

我的上下文是:

public class Context : DbContext, IUnitOfWork
{
    public Context(DbContextOptions<Context> options)
    : base(options)
    {

    }
    public virtual DbSet<Admin> Admin { set; get; }
    public virtual DbSet<Activity> Activities { set; get; }
    public virtual DbSet<ActivityCategory> ActivityCategories { set; get; }
    public virtual DbSet<ActivitiesPic> ActivitiesPics { set; get; }
    public virtual DbSet<ActivityRecord> ActivityRecords { set; get; }
    public virtual DbSet<Answer> Answers { set; get; }
    public virtual DbSet<Company> Companies { set; get; }
    public virtual DbSet<Form> Form { set; get; }
    public virtual DbSet<NazerOrTarah> NazerOrTarah { set; get; }
    
    //Added in 1398/12/13
    public virtual DbSet<ReportDynamicTemplate> ReportDynamicTemplate { set; get; }
    public virtual DbSet<ReportTemplateForms> ReportTemplateForms { set; get; }

    public virtual DbSet<User> Users { set; get; }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.HasDefaultSchema("dbo");
        builder.Entity<Activity>()
            .HasIndex(a => a.CompID);


        builder.Entity<ActivityRecord>()
            .HasIndex(a => new { a.ActivitiesID, a.NazerID });

        builder.Entity<Answer>()
            .HasIndex(a => new { a.ActRecordsID, a.FormID });

        builder.Entity<Form>()
            .HasIndex(a => new { a.ActivitiesID, a.ParentId });

        // it should be placed here, otherwise it will rewrite the following settings!
        foreach (var relationship in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
        {
            relationship.DeleteBehavior = DeleteBehavior.Restrict;
        }

        base.OnModelCreating(builder);
    }

    public void MarkAsChanged<TEntity>(TEntity entity) where TEntity : class
    {
        Update(entity);
    }

    public void ExecuteSqlCommand(string query)
    {
        Database.ExecuteSqlCommand(query);
    }

    public DbCommand ExecuteCreateConnection()
    {
        return Database.GetDbConnection().CreateCommand();
    }

    public void ExecuteOpenConnection()
    {
        Database.OpenConnection();            
    }
    public void ExecuteCloseConnection()
    {
        Database.CloseConnection();
    }
    public void ExecuteSqlCommand(string query, params object[] parameters)
    {
        Database.ExecuteSqlCommand(query, parameters);
    }
}

我在做什么错了?

0 个答案:

没有答案