Linq to SQL DataContext Управление жизненным циклом Проблема - PullRequest
3 голосов
/ 22 мая 2009

Я прочитал статью Рика Страля о способах работы с контекстом данных. Мой 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 как можно дольше?

Ответы [ 4 ]

5 голосов
/ 01 июня 2009

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

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, хотя я могу смешивать некоторые версии.

3 голосов
/ 22 мая 2009

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

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

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

3 голосов
/ 22 мая 2009

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

0 голосов
/ 04 января 2010

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

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