为OData打开MergeOption.NoTracking(WCF数据服务)

问题描述:

我有一个严格为只读的OData端点。我想通过设置MergeOption.NoTracking来获得额外的性能改进。为OData打开MergeOption.NoTracking(WCF数据服务)

post似乎表明它是可能的,但没有例子给出。

有谁知道如何打开WCF数据服务(OData)中的所有实体?

我似乎无法找到的地步,我可以访问数据集将其打开......

如果可能的话,我想在我的OData服务来开启这项功能(而不是使我所有的客户都知道在这个参数来传递(如果一个OData的客户,甚至有可能)

注:这不是如何把它正常WCF问题

。这篇文章谈论的是在客户端(DataServiceContext)进行跟踪,你似乎想禁用跟踪e服务器端。由于DataSource是为每个请求创建的,我不确定跟踪添加了多大的开销 - 实体仅添加到ObjectStateManager。无论如何,我认为如果你覆盖DataService [T] .CreateDataSource()方法,就可以做你想做的事情。在这种方法中,您将返回从ObjectContext类派生的上下文。现在,您将不得不修改所有从ObjectContext返回实体的ObjectQueries,以便使用MergeOption.NoTracking参数创建它们。我真的认为这是值得的我会先在一个EntitySet上试试看看它有多大的好处。

我试过了,它确实对性能有一点点改善......有时。

protected override YourEnityContextHere CreateDataSource() 
{ 
    YourEnityContextHere dataSource = base.CreateDataSource(); 
    TurnOffChangeTracking(dataSource); 
    return dataSource; 
} 

static IEnumerable<PropertyInfo> objSetProps; 
private static void TurnOffChangeTracking(YourEnityContextHere dataSource) 
{ 
    if(objSetProps == null) 
     objSetProps = dataSource.GetType().GetProperties().Where(prop => prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ObjectSet<>)); 

    foreach (PropertyInfo objSetProp in objSetProps) 
    { 
     ObjectQuery objSet = (ObjectQuery)objSetProp.GetValue(dataSource, BindingFlags.GetProperty, null, null, null); 
     objSet.MergeOption = MergeOption.NoTracking; 
    } 
}