Если я создаю проект asp.net и использую структуру сущностей для создания базы данных, что-то вроде этого автоматически добавляется в строки подключения в web.config
:
<add name="DefaultConnection" connectionString="data source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\WebAppName.mdf;initial catalog=WebAppName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
Обратите внимание, что вместо полного пути к файлу используется |Data Directory|
, который в данном случае указывает на папку App_Data. Вот как это объясняется в некоторых документах:
Наличие User Instance=true и AttachDBFilename=|DataDirectory| заставить SqlConnectionHelper сделать вывод, что строка подключения нацелена на SQL Server Express, и инициирует создание базы данных. (Наличие источника данных=.\SQLEXPRESS в строке подключения не влияет на решение, поскольку SqlConnectionHelper поддерживает экземпляры SQL Server Express не по умолчанию, а также экземпляры по умолчанию.) |DataDirectory| Часть строки подключения указывает, что файл MDF находится в каталоге App_Data. SqlConnectionHelper получает имя базы данных из имени файла MDF. Он также создает папку App_Data для хранения MDF, если папка еще не существует.
За исключением того, что если я использую Entity Framework, скажем, в консольном приложении, все это не соответствует действительности — вы просто получите исключение, говорящее, что по указанному пути нет файла, и оно будет игнорировать любую созданную вами папку App_Data
и завершится ошибкой. создать его, если его нет. Если вы полностью удалите раздел AttachDBFilename
, он будет работать, но создаст базу данных в локальном выходном лотке, где находится файл .exe
. Google говорит мне, что вы можете вручную установить |Data Directory|
с помощью AppDomain.SetData
, но, видимо, это все еще неверно для консольного приложения (получите ошибку компиляции, говорящую: «Требуется ссылка на объект»).
Итак, мой вопрос: как именно определяется местоположение |Data Directory|
? Насколько я знаю, тот факт, что он отличается между консольными приложениями и приложениями Asp.net, означает, что разрешение не может происходить исключительно в SQL Server Express, поскольку оба используют одну и ту же установку. Так это происходит на сервере asp.net? Или есть скрытый файл настроек, который создается в проектах asp.net?