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;为什么会再次出现这种错误?

ObjectContext也部署在EF的打开上下文中

您传递给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
}

这是假设你想懒洋洋地加载它——如果你想急切地加载并避免第二次数据库命中,你首先需要在从数据库检索项目时包含它。