Проблема управления временем жизни Linq to SQL DataContext

Я прочитал статью Рика Страла о способах работы с контекстом данных. Мой DBML находится внутри библиотеки классов, я оставляю свой контекст данных открытым, создавая статический метод Current в отдельном настраиваемом частичном классе в библиотеке.

public partial class DataContext
{
    public static DataContext Current
    {
        get
        {
            DataContext dc = HttpContext.Current.Items["dc"] as DataContext;
            if (dc == null)
            {
                dc = new ImmediacyPageDataContext();
                HttpContext.Current.Items["dc"] = dc;
            }

            return dc;
        }
    }

затем получите доступ к нему так

DataContext dc = DataContext.Current;

Однако это вызывает проблемы всякий раз, когда я обновляю свой файл DBML. После редактирования файла DBML всякий раз, когда я пытаюсь построить проект, мой файл конструктора не восстанавливается / не удаляется. Если я попытаюсь запустить опцию настраиваемого инструмента, она вернется с ошибкой.

Единственный способ обойти это - переименование или удаление настраиваемого частичного класса, повторное создание файла конструктора и последующее добавление моего настраиваемого частичного класса обратно в решение. Это действительно работает, но .. это немного больно.

Есть ли лучший подход, который упростит редактирование моих файлов DBML и при этом продлит мой DC как можно дольше?


person Jon Jones    schedule 22.05.2009    source источник


Ответы (4)


Перейдите в файл кода с частичным классом DataContext и переместите операторы using в свое пространство имен. По какой-то причине инструмент не сгенерирует конструктор, если это не так.

namespace MyNamespace
{
    using System;
    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    using System.Reflection;
    using System.Xml.Linq;

    partial class DataContext
    {
    }
}

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

person Ryan Versaw    schedule 01.06.2009

Вы должны создать свой частичный класс в другом файле, а не в файле .designer.cs. Самый простой способ сделать это - щелкнуть правой кнопкой мыши свой DBML в проводнике решений (или в пустой области дизайнера DBML) и выбрать «Просмотреть код». Это создаст новый файл .cs, который не будет перезаписан при сохранении вашего DBML.

person Jaecen    schedule 22.05.2009
comment
Забыл упомянуть, что частичный класс находится в отдельном файле. - person Jon Jones; 22.05.2009
comment
Если вы назовете свой частичный файл чем-то вроде MyContext.partial.cs (вместо MyContext.cs, которое будет соответствовать имени основного MyContext.dbml), тогда IDE не будет связывать ваш частичный файл с основным файлом dbml, и вы можете затем отформатируйте код как хотите. - person Wayne Bloss; 22.08.2009

Я не верю, что ваша настойчивость DataContext и проблема DBML связаны. Похоже, что среда IDE запуталась в конфликте с Cached DataContext (HttpContext.Current.Items для каждого запроса, поэтому в любом случае нет долгосрочного кеширования).

У меня были проблемы с компиляцией DBML, когда моя модель данных содержала имя класса, которое конфликтовало с другим классом. Например, объект DBML с именем «Приложение» (приложение страхования) может конфликтовать с HttpApplicationState.Page.Application.

Проверьте свое сообщение об ошибке и посмотрите, не относится ли оно к имени в вашем DBML.

person Corbin March    schedule 22.05.2009

Я не могу придумать слишком вескую причину, по которой ваше новое статическое свойство должно быть частью класса DataContext. Было бы так же легко получить его в другом классе.

person Dinah    schedule 04.01.2010