2

この問題が数回発生したことを感謝しますが、明確な答えを見つけることができません(おそらく1つはありません!)。

とにかく、タイトルはそれをすべて本当に伝えています。新しいコンテキストを作成し、新しいエンティティを追加します。SaveChanges()には20秒かかります。同じコンテキストで2番目のエンティティであるSaveChanges()インスタントを追加します。

これについて何か考えはありますか?:-)

============更新=============

問題を示すために、既存のモデルに対して実行する非常に単純なアプリを作成しました...

    public void Go()
    {
        ModelContainer context = new ModelContainer(DbHelper.GenerateConnectionString());

        for (int i = 1; i <= 5; i++)
        {
            DateTime start = DateTime.Now;
            Order order = context.Orders.Single(c => c.Reference == "AA05056");
            DateTime end = DateTime.Now;
            double millisecs = (end - start).TotalMilliseconds;
            Console.WriteLine("Query " + i + " = " + millisecs + "ms (" + millisecs / 1000 + "s)");

            start = DateTime.Now;
            order.Note = start.ToLongTimeString();
            context.SaveChanges();
            end = DateTime.Now;
            millisecs = (end - start).TotalMilliseconds;
            Console.WriteLine("SaveChanges " + i + " = " + millisecs + "ms (" + millisecs / 1000 + "s)");

            Thread.Sleep(1000);
        }

        Console.ReadKey();
    }

無効なテストでない限り、私のコードにコメントしないでください;)

結果は次のとおりです。

クエリ1=3999.2288ms(3.9992288s)
SaveChanges 1 = 3391.194ms(3.391194s)

クエリ2=18.001ms(0.018001s)
SaveChanges 2 = 4.0002ms(0.0040002s)

クエリ3=14.0008ms(0.0140008s)
SaveChanges 3 = 3.0002ms(0.0030002s)

クエリ4=13.0008ms(0.0130008s)
SaveChanges 4 = 3.0002ms(0.0030002s)

クエリ5=10.0005ms(0.0100005s)
SaveChanges 5 = 3.0002ms(0.0030002s)

最初のクエリには時間がかかりますが、ビューの生成だと思いますか?またはdb接続?

最初の保存には4秒近くかかりますが、私のアプリでのより複雑な保存には20秒以上かかりますが、これは受け入れられません。

今これでどこに行くべきかわからない:-(

アップデート...

SQL Profilerは、最初のクエリと更新が高速であり、最初のクエリと更新に違いがないことを示しています。ですから、遅延は疑わしいエンティティフレームワークであることを私は知っています。

4

2 に答える 2

3

SaveChanges呼び出しではない可能性があります。EFでデータベースを初めて呼び出すときは、メタデータから初期コード生成を行う必要があります。ただし、コンパイル時にこれを事前に生成できます:http: //msdn.microsoft.com/en-us/library/bb896240.aspx

それが唯一の問題だとしたら驚きますが、それは役立つかもしれません。

こちらもご覧ください:http://msdn.microsoft.com/en-us/library/cc853327.aspx

于 2011-06-20T12:20:39.687 に答える
0

アプリの起動時に次のコードを実行して、所要時間を確認し、その後、最初のSaveChangesが高速かどうかを確認します。

    public static void UpdateDatabase()
    {
        //Note: Using SetInitializer is reconnended by Ladislav Mrnka with reputation 275k
        //http://stackoverflow.com/questions/9281423/entity-framework-4-3-run-migrations-at-application-start
        Database.SetInitializer<DAL.MyDbContext>(
            new MigrateDatabaseToLatestVersion<DAL.MyDbContext,
            Migrations.MyDbContext.Configuration>());

        using (var db = new DAL.MyDbContext()) { 
            db.Database.Initialize(false);//Execute the migrations now, not at the first access
        }
    }
于 2016-11-07T23:03:37.853 に答える