【问题标题】:Turn on MergeOption.NoTracking for OData (WCF Data Services)为 OData(WCF 数据服务)打开 MergeOption.NoTracking
【发布时间】:2012-03-05 22:37:32
【问题描述】:
我有一个严格只读的 OData 端点。我想通过设置 MergeOption.NoTracking 来获得额外的性能改进。
这个post似乎暗示这是可能的,但没有给出例子。
有人知道如何为我在 WCF 数据服务 (OData) 中的所有实体启用此功能吗?
我似乎找不到可以访问数据集以将其打开的点...
如果可能的话,我想在我的 OData 服务中打开它(而不是让我的所有客户端都知道传递这个参数(如果这对于 OData 客户端来说甚至是可能的)。
注意:这不是关于如何为普通 WCF 开启它的问题。
【问题讨论】:
标签:
entity-framework
entity-framework-4
wcf-data-services
odata
【解决方案1】:
该帖子正在讨论客户端(DataServiceContext)的跟踪,您似乎想要禁用服务器端的跟踪。由于 DataSource 是为每个请求创建的,我不确定跟踪增加了多大的开销 - 实体仅添加到 ObjectStateManager。无论如何,如果您覆盖 DataService[T].CreateDataSource() 方法,我认为可以做您想做的事情。在此方法中,您将返回从 ObjectContext 类派生的上下文。现在,您必须修改从 ObjectContext 返回实体的所有 ObjectQueries,以便使用 MergeOption.NoTracking 参数创建它们。我你真的认为值得我先在一个 EntitySet 上尝试一下,看看好处有多大。
【解决方案2】:
我试过了,它的性能确实有如此轻微的改进......有时。
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;
}
}