我正在寻找一种自动迭代所有ObjectQueries的方法,并将merge选项设置为no tracking(只读上下文)。一旦我发现如何做到这一点,我将能够使用T4模板生成默认的只读上下文。这可能吗?
例如,假设我在对象上下文中有这些表
SampleContext
我必须经历并执行以下操作。
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;
}
我最好使用baseclass(ObjectContext):
ObjectContext baseClass = sc as ObjectContext
var objectQueries = sc.MetadataWorkspace.GetItem("Magic Object Query Option);
但我不确定我甚至可以访问查询。任何帮助,将不胜感激。
答案 0 :(得分:4)
如果您想为所有ObjectSet执行此操作,只需一次,对于所有异常,请尝试以下操作:
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;
}
答案 1 :(得分:3)
我认为反思将是唯一的选择。有点像:
IEnumerable<ObjectQuery> queries = from pd in context.GetType().GetProperties()
where pd.PropertyType.IsSubclassOf(typeof(ObjectQuery))
select (ObjectQuery)pd.GetValue(context, null);