2010-04-23 42 views
0

我正在尋找一種自動方法來遍歷所有ObjectQueries,並將合併選項設置爲不進行跟蹤(只讀上下文)。一旦我找到如何做到這一點,我將能夠使用T4模板生成默認的只讀上下文。這可能嗎?自動設置MergeOptions的方法

例如可以說,我有我的目標背景下

SampleContext這些表

  • 表A
  • 表B
  • 表C

我將不得不通過做下面。

SampleContext sc = new SampleContext(); 
sc.TableA.MergeOption = MergeOption.NoTracking; 
sc.TableB.MergeOption = MergeOption.NoTracking; 
sc.TableC.MergeOption = MergeOption.NoTracking; 

我試圖找到一種方法來概括這種使用對象上下文。

我想它弄下來的東西像

foreach(var objectQuery : sc){ 
    objectQuery.MergeOption = MergeOption.NoTracking; 
} 

最好,我想用基類(ObjectContext中)做到這一點:

ObjectContext baseClass = sc as ObjectContext 
var objectQueries = sc.MetadataWorkspace.GetItem("Magic Object Query Option); 

,但我不相信,我甚至可以得到訪問查詢。任何幫助,將不勝感激。

回答

2

我認爲反思將是唯一的選擇。沿着線的東西:

IEnumerable<ObjectQuery> queries = from pd in context.GetType().GetProperties() 
    where pd.PropertyType.IsSubclassOf(typeof(ObjectQuery)) 
    select (ObjectQuery)pd.GetValue(context, null); 
4

如果你想對所有對象集,只是一個時間做到這一點,所有的exection,試試這個:

var Ctx=YourDbContext; 
var objSetProps = Ctx.GetType().GetProperties().Where(prop => prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ObjectSet<>)); 
foreach(PropertyInfo objSetProp in objSetProps) 
{ 
    ObjectQuery objSet = (ObjectQuery)objSetProp.GetValue(Ctx, BindingFlags.GetProperty, null, null, null); 
    objSet.MergeOption=MergeOption.NoTracking; 
}