1

我有一個嚴格爲只讀的OData端點。我想通過設置MergeOption.NoTracking來獲得額外的性能改進。爲OData打開MergeOption.NoTracking(WCF數據服務)

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

有誰知道如何打開WCF數據服務(OData)中的所有實體?

我似乎無法找到的地步,我可以訪問數據集將其打開......

如果可能的話,我想在我的OData服務來開啓這項功能(而不是使我所有的客戶都知道在這個參數來傳遞(如果一個OData的客戶,甚至有可能)

注:這不是如何把它正常WCF問題

回答

2

。這篇文章談論的是在客戶端(DataServiceContext)進行跟蹤,你似乎想禁用跟蹤e服務器端。由於DataSource是爲每個請求創建的,我不確定跟蹤添加了多大的開銷 - 實體僅添加到ObjectStateManager。無論如何,我認爲如果你覆蓋DataService [T] .CreateDataSource()方法,就可以做你想做的事情。在這種方法中,您將返回從ObjectContext類派生的上下文。現在,您將不得不修改所有從ObjectContext返回實體的ObjectQueries,以便使用MergeOption.NoTracking參數創建它們。我真的認爲這是值得的我會先在一個EntitySet上試試看看它有多大的好處。

0

我試過了,它確實對性能有一點點改善......有時。

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