Нет доступа к удаленному объекту - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь изменить некоторые из моих кодов 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;
}

Итак, как вы видите, действия var заполняются путем запуска sp, и он работает, но когда он достигает

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

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...