C# DbContext已与多个局部视图一起处理
我有一个视图,它有3个由选项卡分隔的局部视图。每个局部视图查询数据库并将结果返回到表中显示的列表。数据访问层使用通用存储库访问数据 以下是获取单个表的所有结果的通用方法: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
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这正是我几分钟前发现的问题。检查我的答案。我为整个类共享了一个上下文实例。