C #: стоит ли ObjectTrackingEnabled = false для небольших операций? - PullRequest
5 голосов
/ 10 февраля 2009

Учитывая следующий кусок кода:

using(var data = new SomeDataContext(ConnectionString))
{
  data.ObjectTrackingEnabled = false;

  foreach(Something in data.Somethings)
     someList.Add(something.SomeProperty);
}

Стоит ли устанавливать отслеживание объекта на false? Я знаю, что это всего лишь одна строка кода, но это как-то мешает мне постоянно писать это. Но я слышал, что вы можете добиться некоторого прироста производительности, превратив его, когда он вам не нужен. А поскольку мне просто нужно быстро считывать некоторые данные, мне не нужно отслеживание. Но стоит ли оно такого маленького куска кода? Каково твое мнение? Должен ли я использовать это? Должен ли я не? Почему?

1 Ответ

10 голосов
/ 10 февраля 2009

Если контекст будет немедленно удален, это, вероятно, не стоит - но вот несколько мыслей:

  • возможно, напишите "свободный" метод расширения для контекстов данных (ниже)
  • сделать его по умолчанию, добавив частичный OnCreated метод, который делает это

Пример расширения:

public static class DataContextExt {
    public static T NoTracking<T>(this T ctx)
        where T : DataContext
    {
        ctx.ObjectTrackingEnabled = false;
        return ctx;
    }   

}

Тогда вы можете использовать:

using(var data = new SomeDataContext(ConnectionString).NoTracking())
{...}

Пример частичного метода:

namespace MyData {
    partial class MyDataContext {
        partial void OnCreated() {
            this.ObjectTrackingEnabled = false;
        }
    }
}
...