0

私は作成するためのこの方法を持っています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;

    }

しかし、それは私にこのエラーを2番目に与えますforeach:

ObjectContext インスタンスは破棄されており、接続を必要とする操作には使用できなくなりました。

EFを開いたのでcontext、なぜこのエラーが再び発生するのですか?

4

3 に答える 3

3

IEnumerable<T>あなたが通過しようとしている世界は、toDataTable<T>()まだ実現していません。のコンテキストitemsは既に破棄されています。ToList()呼び出しコードにa を忘れました。

于 2013-08-28T19:54:40.320 に答える
1

同様にitems発生する場合、それが原因である可能性があります-そのコンテキストが閉じている可能性があります。EntityFramework

例外がどの行から発生したか知っていますか?

于 2013-08-28T19:54:53.077 に答える
1

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
}

これは、これを遅延ロードすることを前提としています。積極的にロードして 2 番目のデータベース ヒットを回避したい場合は、最初にデータベースからアイテムを取得するときにそれを含める必要があります。

于 2013-08-28T19:54:53.873 に答える