2009-05-22 5 views
3

Я прочитал article Rick Strahl о способах обработки контекста данных. Мой DBML находится внутри библиотеки классов, я держу свой контекст данных открытым, создавая статический метод Current в отдельном частном классе в библиотеке.Linq to SQL DataContext Lifetime Management Issue

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 как можно дольше?

ответ

5

Перейдите в файл кода с частичным классом 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, хотя я может быть перепутать несколько версий.

+0

работал как шарм. Благодаря! –

3

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

+0

Забыл упомянуть, что частичный класс находится в отдельном файле. –

+0

Если вы называете свой неполный файл чем-то вроде MyContext.partial.cs (вместо MyContext.cs, который будет соответствовать имени основного MyContext.dbml), тогда среда IDE не свяжет ваш частичный файл с основным файлом dbml, и вы может затем форматировать ваш код так, как вам нравится. –

3

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

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

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

0

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

Смежные вопросы