3

ctxSaveChanges()実行後にDbContext を破棄するのはなぜですか?

最初のサンプル:

var ctx = new DomainContext(); 
foreach (var item in deals)
        {
            DealsOfReutersAddition newDealAddition =
                        new DealsOfReutersAddition
                        {
                            DealsOfReutersId = item.DealsOfReutersId,
                            DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                        };
            ctx.DealsOfReutersAdditions.Add(newDealAddition);
            ctx.SaveChanges();
        }

ctx.Dispose();

2 番目のサンプル:

foreach (var item in deals)
        {
            DealsOfReutersAddition newDealAddition =
                        new DealsOfReutersAddition
                        {
                            DealsOfReutersId = item.DealsOfReutersId,
                            DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                        };
            var ctx = new DomainContext(); 
            ctx.DealsOfReutersAdditions.Add(newDealAddition);
            ctx.SaveChanges();
            ctx.Dispose();
        }

1000 行の 2 番目のサンプルでは、​​最初の 140 秒に対して 8 秒と推定されます。再作成する代わりに ctx をきれいにする方法はありますか?

4

1 に答える 1

4

コメントで@JensKlosterが言っていたことに沿ってSaveChanges、ループ内で毎回呼び出す必要は絶対にありません。しかし、実際には、それをループの外に置くという誘惑に抵抗します. コンテキストによって追跡されるオブジェクトの数が増えるにつれて、より多くのメモリが使用され、保存が徐々に遅くなります。

私の解決策は、ループ内に実行中のカウンターを配置して、いつ保存するかを決定することです。

int numberOfRecords = 0;
using(var ctx = new DomainContext())
{
  foreach (var item in deals)
          {
              DealsOfReutersAddition newDealAddition =
                          new DealsOfReutersAddition
                          {
                              DealsOfReutersId = item.DealsOfReutersId,
                              DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                          };

              ctx.DealsOfReutersAdditions.Add(newDealAddition);

              numberOfRecords++;
              if(numberOfRecords % 500 == 0) //Saves after every 500 rows.
              {
                ctx.SaveChanges();
              }
           }
}
于 2013-03-14T13:40:27.583 に答える