2011-03-04 10 views
0

私は関連するPOCOエンティティReferenceのコレクションを持つReportのPOCOエンティティを持っています。 Reportを作成すると、IDのICollection<int>が得られます。私はそうのようなICollection<Reference>を取得するために参照リポジトリを照会するために、このコレクションを使用します。関連するエンティティのコレクションをPOCOを使用してEF4で正しく設定する(srcはDBです)

from r in referencesRepository.References 
where viewModel.ReferenceIds.Contains(r.Id) 
select r 

私はそうのようReportにまっすぐコレクションを接続したいと思います:

report.References = from r in referencesRepository.References 
        where viewModel.ReferenceIds.Contains(r.Id) 
        select r; 

これは動作しませんReferencesので、 ICollectionであり、結果はIEnumerableです。私はToList()することができますが、私はすべての参照をメモリにロードすると思います。 AddRange()機能もありません。

私はこれをメモリにロードせずに実行したいと考えています。

私の質問はthisと非常に似ています。そこでは、唯一の解決策はアイテムをループして1つずつ追加することでした。この質問を除いて、参照のリストはデータベースから来ていません(これは問題と思われました)。私の場合、コレクションはデータベースから来たです。だから私はそれが何とか可能であることを願っています。

ありがとうございます。

答えて

1

エンティティフレームワークで作業する場合、あなたは彼らと一緒に仕事をしたいのであれば基本的にはこのような何か行うことができますメモリにオブジェクトをロードする必要があります。

report.References = (from r in referencesRepository.References 
        where viewModel.ReferenceIds.Contains(r.Id) 
        select r).ToList(); 

他のアプローチは、ダミーのオブジェクトを使用しているが、それは他の問題を引き起こす可能性があります。ダミーオブジェクトは、既存のオブジェクトのPKにIDのみを設定したReferenceオブジェクトの新しいインスタンスです。既存オブジェクトのように動作します。問題は、コンテキストにReportオブジェクトを追加するときに、Referenceの各インスタンスを手作業で設定してObjectStateManagerからUnchangedに設定する必要があります。それ以外の場合は、DBに挿入されます。

report.References = viewModel.ReferenceIds.Select(i => new Reference { Id = i }).ToList(); 

// later in Report repository 
context.Reports.AddObject(report); 
foreach (var reference in report.References) 
{ 
    context.ObjectStateManager.ChangeObjectState(reference, EntityState.Unchanged); 
} 
+0

答えをありがとう。ダミーのアプローチは面白いです。この部分が実際のパフォーマンス上の問題を引き起こしていることに気付くと、おそらくそれを試してみます。今のところ私はToListのアプローチに固執します。 –

関連する問題