1

機能していない行を挿入するためのコードがいくつかありました。

using (MyDbContext context = new MyDbContext()) {
    foreach (Order o in FormOrders) { //That's a List<T> that got generated based on a web form
        context.Orders.Add(o);
    }
    context.SaveChanges();
}

私はついにそれを機能させる方法を見つけました:

foreach (Order o in FormOrders) {
    context.Orders.Add(o);
    context.SaveChanges();
}

しかし、それはあまり効率的ではないことに気づきました。確かに、一度に挿入されるオーダーの最大数は約 40 ですが、ベスト プラクティスをできる限り活用したいと考えています。

コード スニピット #1 は、呼び出されoたポイントの範囲外であるためSaveChanges()機能しなかったと思いますが、これがどのように機能するかを確認するのに十分ではなく、理解できるほど十分に理解していません。より良い方法は何ですか。

また、すべての行に DbContext の新しいインスタンスを使用することになっていると聞きましたが、上記の場合に実装するのはさらに効率的ではありません。本当?

編集

この質問は無視してください。どちらのバージョンも動作するようです。何が問題だったのかわかりません。他の誰かがコメント/回答の一部を役立つと思うかもしれないので、私はそれを削除していません。

4

2 に答える 2

0

ここで閉鎖を扱っていると思います。

このコードがうまくいくか試してください:

using (MyDbContext context = new MyDbContext())
{
    foreach (Order o in FormOrders)
    {
        Order localCopy = o;
        context.Orders.Add(localCopy);
    }
    context.SaveChanges();
}

つまり、Add() メソッドは 1 回だけ実行されます。実行の遅延により、ループの最後の項目のみが追加されます。

(以下にリンクされているジョンの記事からの引用)

閉鎖とは何ですか?

簡単に言えば、クロージャーを使用すると、何らかの動作をカプセル化し、他のオブジェクトと同様にそれを渡し、最初に宣言されたコンテキストに引き続きアクセスできます。これにより、制御構造、論理演算子などを、それらがどのように使用されるかの詳細から分離できます。元のコンテキストにアクセスする機能は、クロージャーを通常のオブジェクトから分離するものですが、クロージャーの実装は通常、通常のオブジェクトとコンパイラのトリックを使用してこれを実現します。

専門家は、これを私がこれまでに説明できなかったよりもはるかにうまく説明します。

于 2012-11-28T21:18:39.687 に答える
0

どのコンテキストを使用しているかはわかりませんが、LINQ to SQL SubmitChanges は、オプティミスティック コンカレンシーの競合に照らして、LINQ to Entitie の SaveChanges とは異なる動作をします。

SubmitChanges = DataContext
SaveChanges = ObjectContext

using (MyDbContext context = new MyDbContext()) {
    foreach (Order o in FormOrders) { //That's a List<T> that got generated based on a web form
        context.Orders.Add(o);
    }
    context.SubmitChanges();
}
于 2012-11-28T20:52:29.000 に答える