Entity Frameworkは、追跡されたエンティティをコンテキストから選択的に保存し、他のものを一括挿入する

bulkinsert c# entity-framework sqlbulkcopy

質問

私はEntity Frameworkをかなり新しくしています。私は自分のエンティティを持つシナリオを見つけました:

public class Company{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Project> Projects{ get; set; }
}

public class Project
{
    public int Id { get; set; }
    public List<ProjectRecord> ProjectRecords { get; set; }
    public DateTime ProjectDate { get; set; }
}

public class ProjectRecord
{
    public int Id { get; set; }
    public virtual Project Project{ get; set; }
    public string Status { get; set; }
}

私は自分の状況を作成し、雇用者を読み込んで雇用者オブジェクトを別のクラスに渡して雇用者エンティティにプロジェクトを追加し、ファイルから約300,000のプロジェクトレコードをロードし、このプロジェクトレコードのリストをプロジェクトに追加します。

Entity Frameworkはこれをすべて追跡していますが、特に高速ではありませんが、それほど悪くはありません。

遅い部分は、私がコンテキスト上でSaveChanges()を呼び出すときです。コンテキストからプロジェクトレコードのリストを切り離してプロジェクトを保存し、 https: //efbulkinsert.codeplex.com/から提供されているバルク挿入拡張機能を使用して、ProjectRecordsを別々に挿入する必要がありました。しかし、私はProjectRecordsを切り離す方法を見つけることができませんでした。

私はプロジェクトエンティティ全体を一括して挿入しようとしました。

        context.BulkInsert(context,
            context.ChangeTracker.Entries()
                .Where(x => x.State == EntityState.Added)
                .Select(x => x.Entity)
                .OfType<Project>()
                .ToList());

        context.SaveChanges();

しかし、これはデータベースに何もしないために長い時間がかかるようです。だから私はそれについて完全に間違っていると思う。

私は、プロジェクトを雇用者のエンティティに追加するときに利用可能なコンテキストを持っていないので、避けることができればそれを利用可能にしたくありません。

パフォーマンスを向上させるための方法はありますか?バルクインサート拡張またはsql一括コピーを使用して、私のコンテキストでSaveChangesを呼び出す場所はありますか?

どんな助けでも大歓迎です。

受け入れられた回答

可能であれば、 ProjectRecordsをロードする際に、最初にProjectRecordsをコンテキストに添付しないことをお勧めします。あなたは

Dictionary<Project, List<ProjectRecord>>

それらを保持し、 Projectを取得し、保存するときにProjectRecord.Projectを設定する際に役立ちます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ