Подтвердить что ты не робот

Могу ли я остановить конструктор dbml от добавления строки подключения в файл dbml?

У нас есть настраиваемая функция AppSettings.GetConnectionString(), которая всегда вызывается для определения строки подключения, которая должна использоваться. Как эта функция работает, не имеет значения для обсуждения. Достаточно сказать, что он возвращает строку подключения, и я должен ее использовать.

Я хочу, чтобы мой LINQ to SQL DataContext использовал это, поэтому я удалил всю информацию из строки данных из файла dbml и создал неполный класс со стандартным конструктором, подобным этому:

public partial class SampleDataContext
{
    public SampleDataContext() : base(AppSettings.GetConnectionString()) { }
}

Это отлично работает, пока я не использую конструктор для перетаскивания таблицы в диаграмму. Акт перетаскивания таблицы на диаграмму сделает несколько нежелательных вещей:

  • Будет создан файл настроек
  • Будет создан файл app.config
  • В моем файле dbml будет встроена строка подключения

Все это делается до того, как я даже сохраню файл!

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

Я могу отменить все эти плохие вещи, но это раздражает. Мне нужно вручную удалить строку подключения и новые файлы после каждого изменения!

В любом случае я могу остановить конструктора от внесения этих изменений без запроса?

ИЗМЕНИТЬ

Требование использовать метод AppSettings.GetConnectionString() было наложено на меня довольно поздно в игре. Я использовал что-то очень похожее на то, что он порождает для меня. Существует довольно много мест, которые вызывают конструктор по умолчанию. Я знаю, что я мог бы изменить их все, чтобы создать контекст данных по-другому (используя другой конструктор, статический метод, factory, ect..). Такое изменение было бы лишь немного раздражающим, поскольку это нужно было бы сделать только один раз. Тем не менее, я чувствую, что это обходит реальную проблему. Файл dbml и файлы конфигурации будут содержать неверную, если не использовать, строку подключения, которая в лучшем случае может запутать других разработчиков.

4b9b3361

Ответ 1

В дизайнере для DBML вы можете щелкнуть правой кнопкой мыши по любому пробелу и нажать "Свойства" (не то же самое, что щелкнуть правой кнопкой мыши по файлу DBML и щелкнуть "Свойства" ). Оттуда разверните опцию "Подключение". Установите "Настройки приложения" на "Ложно" и снимите настройку "Строка подключения". Эти настройки используются разработчиком для создания этого конструктора по умолчанию.

Оттуда вы можете использовать созданный по умолчанию конструктор, созданный вне файла designer.cs. К сожалению, вам придется повторять этот процесс каждый раз, когда вы добавляете новые конструкторы в конструктор. Это раздражает, и я чувствую вашу боль.

Ответ 2

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

Другой вариант - получить ваш DataContext с помощью метода factory, чтобы вы могли скрыть, какой конструктор фактически используется. Еще лучше, если вы это сделаете с помощью инфраструктуры IoC, например, Castle Windsor. Тогда вы сможете делать такие вещи, как:

var context = container.Resolve<DataContext>();

Ответ 3

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