質問: Entity Framework 6 AddRangeメソッドが導入されました。 DbSet.Addメソッドは常にProcessを非常に遅くするDetectChangesを起動するため、大きな挿入には最適です。私はちょうどそれがAddRangeメソッドを持っていないことに気づいたときにIDbSetインターフェイスに基づいていくつかの既存のコードを使用したかった。 DbSetクラスにのみ存在します。 私はちょっとグーグルで、このディスカッションを見つけました - http://forums.asp.net/t/1978828.aspx?Why+is+there+noAddRange+method+for+System+Data+Entity+IDbSet+T+ -実際にAddRangeメソッドがIDbSetインターフェイスに存在しない理由についての明確な結論はありません。 それはバグですか、それともそこにはない理由がありますか?何か案は? **更新** ここでマイクロソフトは私に答えを与えた: これは設計によるものです。メンバを追加すると、インターフェイスを実装している既存のアプリケーションがすべて破棄されるため、DbSetではインターフェイスのアプローチは適切ではありませんでした。 DbSetにメンバーを追加できるようにするため、DbSetは直接的に擬似または継承できる基本クラスです。 IDbSetではなくDbSetを使用する方法を示すリンクがいくつかあります:
回答: 2013年5月16日のEntity Framework Design Meetingノートから : チームは変更を破る可能性を認識しました。 > DbSetクラス(ジェネリックおよび非ジェネリック)は、(ジェネリックまたは非ジェネリック)IDbSetインターフェイスを継承します。 IDbSetは、テストダブルを作成するためのものです。これらのモックや偽物です。 > > しかし、EF6ではDbSetが4つの方法で変更されています。これは、IDbSetの同等の変更に反映された場合、変更が破棄されることになります。 > > * FindAsyncが追加されました > * AddRange / RemoveRangeが追加されました > * ローカル戻り値の型がDbLocalViewに変更されました(この変更は元に戻すことができます) > 彼らは細かい変化について話し合いましたが、最終的にはその変更を回避し、「DbSetをよりモックにする」ことに決めました。 > その決定は、DbSetをより巧みにすることでした。ただし、IDbSetを廃止することはありません。これは、新しいメンバーを使用する必要がないIDbSetを現在使用しているユーザーのための作業を作成するためです。 IDbSetには、DbSetを使用して新しいコードを作成する方法を示し、フィードバックによっては将来のリリースでIDbSetを廃止するように指示するガイダンスを追加します。 > > また、 `IDbSet`のコードを見ると、インターフェースの上部にコメントが追加されます。 > IDbSetはもともとDbSetのテストダブル(モックまたは偽)の作成を可能にすることを目的としていました。しかし、このアプローチは、新しいメンバをインターフェイスに追加すると、新しいメンバなしで既にインターフェイスを実装している既存のコードが破損するという問題があります。 > > したがって、EF6以降、このメンバに新しいメンバは追加されません。また、DbSetをテストダブルの基本クラスとして使用することをお勧めします。 > >