【问题标题】: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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多