C# DbContext已与多个局部视图一起处理

C# DbContext已与多个局部视图一起处理,c#,asp.net-mvc-5,entity-framework-6,C#,Asp.net Mvc 5,Entity Framework 6,我有一个视图,它有3个由选项卡分隔的局部视图。每个局部视图查询数据库并将结果返回到表中显示的列表。数据访问层使用通用存储库访问数据 以下是获取单个表的所有结果的通用方法: public virtual IList<T> GetAll<T>(params Expression <Func<T, object>>[] navigationProperties) where T : class { try

我有一个视图,它有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);
            }
        }
公共虚拟IList GetAll(参数表达式[]导航属性),其中T:class
{
尝试
{
使用(上下文)
{
名单;
IQueryable dbQuery=Context.Set();
foreach(navigationProperties中的表达式navigationProperty)
dbQuery=dbQuery.Include(navigationProperty);
list=dbQuery.AsNoTracking().ToList();
退货清单;
}
}
捕获(ArgumentNullException-ex)
{
抛出新的InvalidOperationException($“无效状态:{typeof(T).Name}DbSet为null.”,ex);
}
}

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

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

        }
公共异步任务


因此,我的问题是,如何防止在第三次通话前处理上下文?

每天学习新的东西

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

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

在我的方法中,我使用了
上下文
。因此,每次调用该方法时,它都使用在实例化和处理该类时创建的上下文。为了解决这个问题,我将上下文创建直接放在using语句中。因此,我没有使用(上下文)
而是将它改为使用(var db=new limsentiescontext())

每天学习新的东西

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

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

在我的方法中,我使用了
上下文
。因此,每次调用该方法时,它都使用在实例化和处理该类时创建的上下文。为了解决这个问题,我将上下文创建直接放在using语句中。所以,我没有使用(Context)而是将它改为使用(var db=new limsentiescontext())

只要
Context
实例到达
using
语句的末尾,它就会被释放。如果通用存储库的不同实例之间共享一个实例,则您将尝试使用disposed instance。我敢打赌,当您连续两次调用
DataTableAsync
方法时,您也会遇到同样的错误。@dropoutcoder这正是我几分钟前发现的问题。检查我的答案。我为整个类共享了一个上下文实例。您的
Context
实例在使用
语句到达
末尾时将被释放。如果通用存储库的不同实例之间共享一个实例,则您将尝试使用disposed instance。我敢打赌,当您连续两次调用
DataTableAsync
方法时,您也会遇到同样的错误。@dropoutcoder这正是我几分钟前发现的问题。检查我的答案。我为整个类共享了一个上下文实例。