2011-07-12 8 views
3

EF 4.0の上にTrackable Entitiesを使用しています。ToListメソッドはTrackableCollectionには使用できません

すべての従属エンティティを持つエンティティを削除するには、EntityManagerのDeleteメソッドから呼び出されるジェネリックDeleteDependentEntitiesを作成しています。 DeleteDependentEntitiesスキャンは、対象のエンティティセットのすべての子を再帰的にスキャンします(データベース内の関係に設定するCASCADE DELETEに依存しない、またはしたくない)。

一般的なので、プロジェクト全体のすべてのエンティティで使用できるように、私は動的なタイプを使用しています。次のように

方法は次のとおりです。

private void DeleteDependentEntities(dynamic entitySet, dynamic context) 
{ 
    if (entitySet != null) 
    { 
    foreach (dynamic item in entitySet.ToList()) 
    { 
     // 1. Scan object for children and delete children 
     ProcessChildren(item, context); 

     // 2. Delete this object 
     context.DeleteObject(item); 
    } 
    } 
} 

それはOKコンパイルしますが、実行時に、私は次のエラーを取得する:

「SLS.AnimalIntakeMgmt.DataTypes.TrackableCollectionは」の定義が含まれていません'ToList'

したがって、型推論は正常に機能しました。 TrackableCollectionはObservableCollectionに基づいており、ObservableCollectionはCollectionに基づいているため、ToList定義の問題は奇妙です。

ループ内でコレクションが変更されるため、foreachループが失敗するため、ToListが必要です。

すべての提案は大歓迎です!

答えて

2

ダイナミクスは拡張メソッドでは機能しません。ランタイムは、動的オブジェクト自体で定義されたメソッドのみを検索します。
あなたは、静的メソッドとしてToListメソッドを呼び出す必要があります:

foreach (dynamic item in Enumerable.ToList(entitySet)) 

しかし、私は本当に可能な場合は、すべてのジェネリック医薬品を使用すべきだと思います。

+0

しかし、あなたが正しいです、元のコードは嘘つきです。 –

+0

ヒントのThx Daniel、うまくいきます。以前はジェネリックスで試してみましたが、さらにレベル呼び出しのために型を取得することに問題がありました。 @Ales:あなたの考えを共有するためのthxは、あなたが完璧なコードを書いていることを願っています。 –

+0

@Marc:私の答えを受け入れることを忘れないでください:[回答を受け入れる方法](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –