Лучший способ обработки DataContext в LINQ to SQL - PullRequest
3 голосов
/ 22 июля 2011

Я получил работу по внедрению LINQ to SQL для нового модуля в нашем приложении ASP.NET. Я забыл лучший способ обработки DataContext, необходимого для извлечения объектов; я должен создать это в каждом методе, который использует это, или иметь некоторый класс Утилиты, чтобы управлять этим по-другому?

Например, у меня есть класс, который в стиле ActiveRecord извлекает сущность. Должен ли я использовать что-то вроде:

using (MyAppDataContext context = new MyAppDataContext()) 
{
    // do stuff here...
}

в каждом из этих методов? Я видел, как это часто используется в руководствах по LINQ, но я также видел способ, где есть класс Utilities, который имеет некоторый метод, который возвращает DataContext (GetContext или аналогичный); Я забыл, был ли этот метод просто оберткой вокруг нового или он использовал какой-то механизм типа Singleton.

Какой подход лучше?

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Лично я использую что-то похожее на это:

public class MyClass : MyBaseClass
{
     public void GetData()
     {
          using(DbDataContext db = new DbDataContext())
          {
              // DO STUFF
          }
     }

     public void PerformLogicallyAtomicAction()
     {
          using(DbDataContext db = new DbDataContext())
          {
              // DO STUFF
          }
     }
}

Если нет необходимости держать контекст данных открытым дольше.

Обновление

Чтобы пояснить немного больше о причинах, по которым я это делаю:

1) Мне не нужен объект в памяти дольше, чем он мне нужен

Ниже приводится основная причина

2) Отслеживание изменений данных в некоторых случаях приводит к устареванию данных (см. 2-й комментарий к OP)

3) Создание нового объекта занимает 0 раз (эффективно)

4) Создавая его каждый раз, когда мне это нужно, я могу изменить определенные параметры LINQ (например, ObjectTrackingEnabled (который я часто отключаю)

0 голосов
/ 22 июля 2011

Я бы использовал класс / объект, чтобы содержать методы, которые вы используете для этого хранилища данных. Я создаю экземпляр datacontext вместе с классом, а затем могу использовать его для чтения данных, а затем обновлять его и оставаться в том же контексте.

Я также использую этот класс для централизации строки подключения, чтобы у меня была согласованность во всем приложении при доступе к этим конкретным данным:

public class MyInfoRepository
{
    MyInfoDataContext _dc;
    public MyInfoRepository()
    {
        try
        {
            _dc = new MyInfoDataContext(GetDbConnection());
        }
        catch (Exception ex)
        {
            ExceptionLogger.LogServerException(ex, TraceEventType.Error);
            throw;
        }
    }

    private static string GetDbConnection()
    {
        // if no connection string return empty which will stop processing
        if (ConfigurationManager.ConnectionStrings["MyInfo"] == null)
        {
            throw new ConfigurationErrorsException("No connection string specified.");
        }

        string connection = ConfigurationManager.ConnectionStrings["MyInfo"].ConnectionString;

        return connection;
    }

...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...