C# 无法访问已释放的对象

C# 无法访问已释放的对象,c#,asp.net-core,entity-framework-core,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>());

我正在尝试将我的一些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;
}
错误:

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

出现

ActiviteService是我的存储库,它运行以下各项:

public async Task<Activity> GetByIdWithFormsAsync(long id)
{
    return await _activities.Include(x => x.Forms).FirstOrDefaultAsync(x => x.ID == id);
}
公共异步任务GetByIdWithFormsAsync(长id)
{
return wait_活动。包括(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;
}
公共异步任务GetSpMainActiveFormListAsync(长actId) { var Check=新列表(); 使用(_unitOfWork) { 使用(var cmd=\u unitOfWork.ExecuteCreateConnection()) { cmd.CommandText=“SpGetMainActiveForm”; cmd.CommandType=System.Data.CommandType.StoredProcess; var param1=cmd.CreateParameter(); param1.ParameterName=“actId”; param1.Value=actId; cmd.Parameters.Add(param1); _unitOfWork.ExecuteOpenConnection(); 使用(var result=cmd.ExecuteReader()) { if(result.HasRows) { Check=(列表)CommonFunctions.Conversions.MapToList(结果); } } _unitOfWork.ExecuteCloseConnection(); } } 退货检查; } 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());
}
公共接口IUnitOfWork:IDisposable
{
EntityEntry条目(TEntity实体),其中TEntity:类;
void MarkAsChanged(tenty实体),其中tenty:class;
DbSet Set(),其中tenty:class;
int SaveChanges(bool acceptAllChangesOnSuccess);
int SaveChanges();
void ExecuteSqlCommand(字符串查询);
DbCommand ExecuteCreateConnection();
void ExecuteOpenConnection();
void ExecuteCloseConnection();
void ExecuteSqlCommand(字符串查询,参数对象[]参数);
任务savechangesync(bool acceptAllChangesOnSuccess,CancellationToken CancellationToken=new CancellationToken());
任务保存更改同步(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);
    }
}
公共类上下文:DbContext,IUnitOfWork
{
公共上下文(DbContextOptions选项)
:基本(选项)
{
}
公共虚拟数据库集管理{set;get;}
公共虚拟数据库集活动{set;get;}
公共虚拟数据库集活动类别{set;get;}
公共虚拟数据库集活动pics{set;get;}
公共虚拟数据库集活动记录{set;get;}
公共虚拟数据库集回答{set;get;}
公共虚拟数据库集公司{set;get;}
公共虚拟数据库集表单{set;get;}
公共虚拟数据库集NazerOrTarah{set;get;}
//于1398/12/13年添加
公共虚拟DbSet ReportDynamicTemplate{set;get;}
公共虚拟数据库集ReportTemplateForms{set;get;}
公共虚拟数据库集用户{set;get;}
模型创建时受保护的覆盖无效(ModelBuilder)
{
builder.hasdaultschema(“dbo”);
builder.Entity()
.HasIndex(a=>a.CompID);
builder.Entity()
.HasIndex(a=>new{a.ActivitiesID,a.NazerID});
builder.Entity()
.HasIndex(a=>new{a.ActRecordsID,a.FormID});
builder.Entity()
.HasIndex(a=>new{a.ActivitiesID,a.ParentId});
//它应该放在这里,否则它将重写以下设置!
foreach(builder.Model.GetEntityTypes()中的var关系。SelectMany(e=>e.GetForeignKeys())
{
relationship.DeleteBehavior=DeleteBehavior.Restrict;
}
基于模型创建(生成器);
}
public void MarkAsChanged(tenty实体),其中tenty:class
{
更新(实体);
}
public void ExecuteSqlCommand(字符串查询)
{
Database.ExecuteSqlCommand(查询);
}
public DbCommand ExecuteCreateConnection()
{
返回Database.GetDbConnection().CreateCommand();
}
public void ExecuteOpenConnection()
{
OpenConnection();
}
public void ExecuteCloseConnection()
{
CloseConnection();
}
public void ExecuteSqlCommand(字符串查询,参数对象[]参数)
{
ExecuteSqlCommand(查询、参数);
}
}
我做错了什么

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);
    }
}