использование базы данных SQL в нескольких проектах - PullRequest
3 голосов
/ 09 августа 2010

У меня есть система из 5 приложений.Каждое приложение обращается к базе данных через библиотеку DAL.В DAL у меня есть app.config со следующей записью:

<connectionStrings>
<add name="DataAccessLayer.Properties.Settings.ConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=c:\users\something\something\MyDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" providerName="System.Data.SqlClient" />
</connectionStrings>

Использование полного пути для attachDbFilename работает нормально.Но я не рад:

  1. Я скопировал файл app.config в каждое приложение, которое использует базу данных.Лучший способ сделать это - скопировать DAL app.config в качестве ссылки в других проектах?

  2. Мне не нужен полный путь, когда речь идет о развертывании, которое не будет работать.Относительные пути в app.config не работают.В идеале я хотел бы иметь возможность вытягивать DAL из системы управления исходным кодом на любой компьютер и не беспокоиться об изменении строки подключения каждый раз.Это: http://blogs.msdn.com/b/smartclientdata/archive/2005/08/26/456886.aspx говорит о | DataDirectory |для целей развертывания, но это не работает для меня в отладке (если я не использую это неправильно, см. 3)

  3. Это может быть лучше, как отдельный вопрос, но это связано с2. - Есть ли «хороший» способ организации нескольких проектов для отладки?Я создал каталог Bin и в настройках каждого проекта я копирую dll / exe в этот каталог bin.У меня также есть копия базы данных здесь (я не пробовал путь в app.config, но он тоже не работал, как и | DataDirectory |).Также невероятно раздражает то, что относительные пути также не работают в настройке Debug \ Working Directory, так что, похоже, это одно место, которое придется менять каждый раз, когда код извлекается на новую машину?*

    Извинения за войну и мир и заранее спасибо за любые идеи.

Ответы [ 2 ]

4 голосов
/ 09 августа 2010

Использование строки подключения AttachDbFilename из нескольких процессов, ссылающихся на один и тот же MDF очень плохая идея . Совместное использование автоматически подключенной базы данных может привести к возникновению всевозможных проблем при запуске базы данных безопасности / владения. И указание User Instance=True похоже на заливку газа над пламенем, поскольку каждый пользовательский экземпляр равен на пользователя , поэтому, если ваши приложения когда-либо настроены для работы с другими учетными данными apppool или одно внезапно изменяется на олицетворение, все адские разрывы рыхлый.

Просто прикрепите MDF как обычную базу данных к своему экземпляру SQL и используйте его как таковой со строкой соединения normall: Data Source=.\SQLEXPRESS;Initial Catalog=<dbname>; Integrated Security=True.

4 голосов
/ 09 августа 2010

Два ответа - но не совсем полные решения:

1) Я скопировал файл app.config в каждое приложение, которое использует базу данных.Лучший способ сделать это - скопировать DAL app.config в качестве ссылки в других проектах?

Вы можете перенести строки подключения в их собственную конфигурацию, что-то вроде:

<connectionStrings configSource="connectionStrings.config" />

и затем иметь эти строки подключения в этом новом файле:

<connectionStrings>
   <add name="DataAccessLayer.Properties.Settings.ConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=c:\users\something\something\MyDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" providerName="System.Data.SqlClient" />
</connectionStrings>

Таким образом, вы можете иметь собственные app.config's, но иметь общую общность.

2) Iне хочу полного пути, когда дело доходит до развертывания, которое не будет работать.Относительные пути в app.config не работают.

К сожалению, единственное, что вы можете здесь сделать, это использовать заполнитель |DataDirectory|, который является заполнителем для папки App_Dataв приложении ASP.NET.

   <add name="DataAccessLayer.Properties.Settings.ConnectionString" 
        connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|MyDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" 
        providerName="System.Data.SqlClient" />

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

...