2011-07-12 17 views
3

我們正在使用EF 4.0之上的可跟蹤實體。ToList方法不適用於TrackableCollection

爲了刪除一個實體及其所有依賴實體,我正在編寫一個通用的DeleteDependentEntities,以便從EntityManager中的Delete方法中調用。 (我們不希望或不希望依賴CASCADE DELETE來設置數據庫中的關係。)DeleteDependentEntities掃描recursevly受約束的實體集的所有子對象。

爲了保持它的通用性,以便它可以用於整個項目中的所有實體,我正在使用動態類型。

的方法如下:

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'

因此,類型推斷工作正常。 ToList定義的問題很奇怪,因爲TrackableCollection基於ObservableCollection,而ObservableCollection又基於Collection。

ToList是必需的,否則foreach循環會失敗,因爲集合在循環中被修改。

歡迎您提出任何建議!

回答

2

問題是動態不適用於擴展方法。運行時只會查找在動態對象本身上定義的方法。
你需要調用ToList作爲一個靜態方法:

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

但我真的認爲你應該儘可能地全部使用泛型。

+0

很好的答案。但是你是對的,原始代碼看起來很糟糕。 –

+0

Thx丹尼爾的提示,它工作正常。之前嘗試了泛型,但在檢索進一步級別調用的類型時遇到了問題。 @Ales:thx分享你的想法,希望你正在寫出完美的代碼。 –

+0

@馬克:請不要忘記接受我的回答:[如何接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –