2011-12-19 61 views
1

我正在使用EntityFramework和IRepository模式,我需要向所有EntityCollections添加一些事件。ObjectContext上的ObjectSet和ObjectSet上的EntityCollections的列表

有沒有辦法在ObjectContext上獲取集合列表?
我還需要一種方法來獲取ObjectSet/EntityCollection上的所有集合。那可能嗎?

我的最終目標是迭代所有集合和子集合,並將AssociationChanged事件添加到我的所有子集合。當關系被刪除時,它將調用對象上的刪除。

這可以彌補EF does not support connectionless deletes(至少不喜歡它支持無連接更新和插入)的事實。

回答

3

你可以得到使用下面的未經測試的代碼ObjectSets:

var objSetProps = instanceOfObjectContext.GetType().GetProperties().Where(prop => prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ObjectSet<>)); 

foreach(PropertyInfo objSetProp in objSetProps) 
{ 
    var objSet = objSetProp.GetValue(instanceOfObjectContext, BindingFlags.GetProperty, null, null, null); 
} 

訣竅是要與對象集一起工作,一旦你有實例,因爲它的ObjectSet是通用的,與普通類型的變量工作能當你不知道用什麼類型來定義它們的時候,那麼就不那麼明顯了。對於獲取對象集上的實體集合,可以採取類似的方法,但我目前沒有這樣做的例子。

+0

這很好,但最終它不適用於我,因爲我無法將對象作爲ObjectSet引用。 (這個var等同於一個'object'。)因爲我不知道編譯時的類型(ObjectSet必須是通用的,所以無法從該對象集合中獲取EntityCollections的列表。:( – Vaccano 2011-12-19 22:41:16

2

要延長有關的ObjectSet方法上面的回答,在我的情況給您進行以下通用的PropertyInfo類型中建立的基本類型:

propertyInfo.PropertyType.GetGenericArguments(); 

,這將給你應用到的參數類型運行時這種特殊的泛型類型。我相信這些的EntityFramework只ObjectSets支持單一的參數,以便找出潛在的對象類型,簡直是:

propertyInfo.PropertyType.GetGenericArguments().First(); 

由於M.巴布科克上面誰在第一時間在這裏得到了我。

相關問題