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

时间:2012-03-05 22:37:33

标签: entity-framework entity-framework-4 wcf-data-services odata

我有一个严格只读的OData端点。我想通过设置MergeOption.NoTracking来获得额外的性能提升。

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

是否有人知道如何为WCF数据服务(OData)中的所有实体启用此功能?

我似乎无法找到可以访问数据集的地方......

如果可能的话,我想在我的OData服务中启用它(而不是让我的所有客户都必须知道传递这个参数(如果甚至可以用于OData客户端)。

注意:这不是关于如何为普通WCF启用它的问题。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;
    }
}