1
    protected override void Seed(Fitlife.Domain.Concrete.EFDBContext context)
    {
        List<List<string>> foodweights = GetLines(basePath + "FoodWeights.txt");
        int counter = 0;
        foodweights.ForEach(line =>
        {
            FoodWeights newVal = new FoodWeights()
            {
                 FoodCode = int.Parse(line[0]),
                  PortionCode = int.Parse(line[1]),
                 PortionWeight = decimal.Parse(line[2])
            };
            context.FoodWeights.Add(newVal);

            if (++counter == 1000)
            {
                counter = 0;
                context.SaveChanges();                  
            }
        });
}

上記の方法を使用して、データベースにデータを入力します。しかし、1000 エントリに 50 秒かかります。470k エントリのファイルがあります。パフォーマンスを改善するにはどうすればよいですか。エンティティ フレームワークを使用しています。パッケージ マネージャで PM> update-database を実行すると、このメソッドが呼び出されます。同様の機能が必要です。私はasp.netとエンティティフレームワークに非常に慣れていないため、ガイダンスをいただければ幸いです。

PS: 1000 エントリに 50 秒かかっても大丈夫ですか、それとも何か間違っていますか?

4

1 に答える 1

1

Seed メソッドはアプリケーションが起動するたびに実行されるため、コード化した方法ではFoodWeights を何度も追加しようとします。EF はAddOrUpdateそれを防ぐための便利な方法として を提供していますが、実際には一括挿入には適していません。

データベースで直接 sql を使用できます。また、sql サーバーを使用している場合、その sql は'BULK INSERT'である可能性があります。

おそらく、既知の状態から挿入を 1 回だけ実行する必要があり、コンテキストの効率や変更の追跡などを心配する必要がなくなるため、SQL を Up 移行に入れます。

ここにコード例と詳細情報があります: SQL ファイルを使用してデータをシードする方法

于 2013-10-11T08:20:12.210 に答える