【问题标题】:DbContext has been disposed with multiple partial viewsDbContext 已配置多个局部视图
【发布时间】:2020-06-05 06:51:41
【问题描述】:

我有一个视图,其中有 3 个由选项卡分隔的部分视图。每个局部视图都查询数据库并将结果返回到表中显示的列表。数据访问层使用通用存储库来访问数据。

这是获取单个表的所有结果的通用方法:

 public virtual IList<T> GetAll<T>(params Expression <Func<T, object>>[] navigationProperties) where T : class
        {

            try
            {
                using (Context)
                {
                    List<T> list;
                    IQueryable<T> dbQuery = Context.Set<T>();

                    foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                        dbQuery = dbQuery.Include<T, object>(navigationProperty);

                        list = dbQuery.AsNoTracking().ToList();

                    return list;
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new InvalidOperationException($"Invalid state: {typeof(T).Name} DbSet is null.", ex);
            }
        }

Here is the resource I used for creating this method

要使用此方法,我手动包含导航属性。这些是视图中使用的导航属性。

 public async Task<ActionResult> DataTableAsync<TEntity>(AlertModel alert, string viewName = null, 
params Expression<Func<TEntity, object>>[] navigationProperties) where TEntity : class
        {

            // get data
            var data = (from a in await LimsManager.AllAsync<TEntity>(navigationProperties)
                        select a).ToList();

            // create sample log model 
            var response = new TableModel<TEntity>
            {
                Data = data
            };

            return PartialView(viewName ?? $"_{typeof(TEntity).Name}Table", response);

        }

导航属性通过 lambda 表达式 s =&gt; s.'NavigationProperty' 传入。

在这个视图中,我为每个局部视图调用GetAll() 方法。前两个局部视图正确返回,但第三个局部视图总是给我上下文已被处理的错误。即使在调用.ToList() 时也会发生这种情况。

根据我通过研究问题的理解,似乎上下文在第二次调用结束时被处理,所以到第三次调用the context is already gone

所以我的问题是,如何防止在第三次调用之前处理上下文?

【问题讨论】:

  • 您的Context 实例在到达using 语句的末尾时被释放。如果在您尝试使用已处置实例的通用存储库的不同实例之间共享单个实例。我敢打赌,当您连续两次调用 DataTableAsync 方法时,您会遇到同样的错误。
  • @dropoutcoder 这正是我几分钟前发现的问题。检查我的答案。我为整个班级共享了一个 Context 实例。

标签: c# asp.net-mvc-5 entity-framework-6


【解决方案1】:

每天都在学习新东西。

在我的实体框架库 (DAL) 中,我有一个上下文构造函数

 public Store(EntitiesContext context)
        {
            Context = context;
        }

在我的方法中,我使用了Context。因此,每次调用该方法时,它都会使用在类被实例化并被释放时创建的 Context。为了解决这个问题,我只是将上下文创建直接放在 using 语句中。所以我把using(Context)改成了using (var db = new LimsEntitiesContext())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多