自动设置MergeOptions的方法

时间:2010-04-23 11:35:09

标签: entity-framework .net-3.5

我正在寻找一种自动迭代所有ObjectQueries的方法,并将merge选项设置为no tracking(只读上下文)。一旦我发现如何做到这一点,我将能够使用T4模板生成默认的只读上下文。这可能吗?

例如,假设我在对象上下文中有这些表

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;
}

我最好使用baseclass(ObjectContext):

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

但我不确定我甚至可以访问查询。任何帮助,将不胜感激。

2 个答案:

答案 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);