ObjectContext也部署在EF的打开上下文中
本文关键字:上下文 EF 部署 ObjectContext | 更新日期: 2023-09-27 18:29:19
我有这个方法来创建DataTable
:
private DataTable toDataTable<T>(IEnumerable<T> items)
{
var tb = new DataTable(typeof(T).Name);
using (var context = new MyEntity())
{
PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var prop in props)
{
tb.Columns.Add(prop.Name, prop.PropertyType);
}
foreach (var item in items)
{
var values = new object[props.Length];
for (var i = 0; i < props.Length; i++)
{
values[i] = props[i].GetValue(item, null);
}
tb.Rows.Add(values);
}
}
return tb;
}
但它在第二个foreach
:中给了我这个错误
ObjectContext实例已被释放,不能再用于需要连接的操作。
自从我打开EF的context
;为什么会再次出现这种错误?
您传递给toDataTable<T>()
的IEnumerable<T>
尚未实现。items
的上下文已被释放。您在调用代码中忘记了一个ToList()
。
如果items
也源自EntityFramework
,那么它可能是罪魁祸首——它的Context可能已经关闭。
你知道异常源自哪一行吗?
我假设items
集合包含EF中的实体。这些项目最初属于ObjectContext
,在您将它们传递到此方法之前,它显然已关闭。打开一个全新的上下文并没有帮助,因为这不是这些物品所属的上下文
当您在其中一个实体上使用反射时,很可能会尝试延迟访问该实体的导航属性,这将需要数据库访问,但由于该实体所属的上下文已不存在,因此无法进行数据库访问。
您可以将项目重新附加到新的上下文中,然后这应该可以工作:
foreach (var item in items)
{
context.Attach(item);
... // now your item is attached to a live context again, and it
// can hit the database
}
这是假设你想懒洋洋地加载它——如果你想急切地加载并避免第二次数据库命中,你首先需要在从数据库检索项目时包含它。