Включите MergeOption.NoTracking для OData (службы данных WCF) - PullRequest
1 голос
/ 06 марта 2012

У меня есть конечная точка OData, которая только для чтения. Я хотел бы получить дополнительное улучшение производительности, установив MergeOption.NoTracking.

Этот пост , кажется, предполагает, что это возможно, но пример не приводится.

Кто-нибудь знает, как включить это для всех моих сущностей в службах данных WCF (OData)?

Кажется, я не могу найти точку, где я могу получить доступ к наборам данных, чтобы включить его ...

Если это вообще возможно, я бы хотел включить это в моей службе OData (вместо того, чтобы заставить всех моих клиентов знать, что нужно передать этот параметр (если это даже возможно для клиента OData).

ПРИМЕЧАНИЕ: Это не вопрос, как включить его для обычного WCF.

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

В посте говорится об отслеживании на стороне клиента (DataServiceContext), и вы, похоже, хотите отключить отслеживание на стороне сервера. Поскольку DataSource создается для каждого запроса, я не уверен, насколько большие накладные расходы добавляет отслеживание - объекты добавляются только в ObjectStateManager. В любом случае, я думаю, что можно делать то, что вы хотите, если переписать метод DataService [T] .CreateDataSource (). В этом методе вы бы возвращали свой контекст, полученный из класса ObjectContext. Теперь вам нужно изменить все ObjectQueries, которые возвращают сущности из ObjectContext, чтобы они создавались с параметром MergeOption.NoTracking. Если вы действительно думаете, что это того стоит, я сначала попробую сделать это на одном EntitySet, чтобы увидеть, насколько велика будет польза.

0 голосов
/ 06 марта 2012

Я попробовал это, и у него было очень небольшое улучшение производительности ... иногда.

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