2008-11-04 3 views
2

Обычно я сохраняю все свои конфиги в реестре. Несмотря на то, что я начал использовать LINQ, мне не хотелось бы иметь DSN в web.config, но пусть он останется в реестре и подключит его (возможно, в Событии запуска приложения) к Системной конфигурации.Установить LINQ DSN для DataContext

Как это можно сделать?

Thanx для любых идей!

Редактирование: чтобы было ясно: я не хочу писать в файл web.config, я просто хочу сохранить dsn (зашифрованный) где-нибудь еще, кроме web.config, поэтому у меня есть тот же web.config на всех этапах развития (локальный, стагинский, живой, резервный).

Christoph

Решение Код в VB.Net:

1) Добавить новый класс, с одним методом, который наследует от исходного DataContext:

Public Class MyDatabaseDataContext 

Inherits DatabaseDataContext 

Public Sub New() 
    MyBase.New(Settings.DSN) 
End Sub 

End Class 

2) Использование этот класс во всех источниках Linq вместо исходного контекста.

ContextTypeName="MyProject.MyDatabaseDataContext 
+0

Вам лучше не пытаться бороться с системой и переходить к файлам конфигурации, настраиваемым конфигурационным блокам и классам настроек, поскольку это поощряет инфраструктура. Это больше не VB6;) – TheSoftwareJedi 2008-11-04 22:49:00

ответ

1

Вот что я делаю. У меня есть базовый класс для моего DataContext. Он называется DataContextBase и генерируется sqlmetal.exe. У меня есть производный класс DataContext, который используется в моих вызовах Linq. Это выглядит следующим образом:

public class DataContext : DataContextBase 
{ 
    public DataContext() 
     : base(ConnectionHolder.ConnectionString) 
    { 
    } 
} 

У меня есть статический класс в моей библиотеке под названием ConnectionHolder, который хранит строку подключения:

public static class ConnectionHolder 
{ 
    static string _ConnectionString; 

    public static string ConnectionString 
    { 
     get { return _ConnectionString; } 
     set { _ConnectionString = value; } 
    } 
} 

(примечание: это отдельно от DataContext, потому что есть места в моем приложении вне Linq, что я использую строку подключения). При запуске приложения я говорю ConnectionHolder.ConnectionString = (везде, где вы храните строку подключения).

1

Почему бы просто не зашифровать его в web.config? Достаточно легко зашифровать только строки подключения в файле web.config по адресу Application_Start, если вы не хотите использовать aspreg_iis. Вы даже можете отредактировать зашифрованный web.config, используя инструмент IIS Admin.

Configuration config = WebConfigurationManager.OpenWebConfiguration(
           HttpContext.Current.Request.ApplicationPath); 
ConfigurationSection section = config.Sections["connectionStrings"]; 
if (!section.SectionInformation.IsProtected 
    && !GlobalConfiguration.ApplicationVersion.EndsWith("dev")) // don't encrypt dev 
{ 
    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); 
    config.Save(); 
} 

Если вы хотите сохранить его в реестре. Вы всегда можете использовать конструктор в DataContext, который принимает строку подключения и передает значение, которое вы читаете из реестра. Предположительно, вы сохранили бы это в хранилище приложений, поэтому вам нужно будет только один раз прочитать его в реестре.

У Скотта Гатри есть хорошая страница references для шифрования вашей веб-конфигурации, хотя в большинстве примеров используется aspreg_iis. Я предпочитаю делать это на Application_Start, поэтому я не забудьте зашифровать его при аварии.

+0

Я уже использовал перезапись конструктора DataContext, но у этого есть 2 проблемы: мне нужно удалить конструктор по умолчанию в DB.designer.vb, и в любое время, когда я меняю dbml, конструктор в DB.designer.vb воссоздается. – Christoph 2008-11-05 07:50:13

+0

Невозможно инициализировать DataContext с помощью настраиваемого DSN при запуске приложения? – Christoph 2008-11-05 07:50:47

0

Это довольно разумное требование при работе с устаревшим кодом.

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

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