【发布时间】: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 => s.'NavigationProperty' 传入。
在这个视图中,我为每个局部视图调用GetAll() 方法。前两个局部视图正确返回,但第三个局部视图总是给我上下文已被处理的错误。即使在调用.ToList() 时也会发生这种情况。
根据我通过研究问题的理解,似乎上下文在第二次调用结束时被处理,所以到第三次调用the context is already gone。
所以我的问题是,如何防止在第三次调用之前处理上下文?
【问题讨论】:
-
您的
Context实例在到达using语句的末尾时被释放。如果在您尝试使用已处置实例的通用存储库的不同实例之间共享单个实例。我敢打赌,当您连续两次调用DataTableAsync方法时,您会遇到同样的错误。 -
@dropoutcoder 这正是我几分钟前发现的问题。检查我的答案。我为整个班级共享了一个 Context 实例。
标签: c# asp.net-mvc-5 entity-framework-6