Хобрук: Ваш путь к мастерству в программировании

Каково расположение |Каталога данных| в строках подключения разрешено?

Если я создаю проект 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?


  • Вы МОЖЕТЕ использовать SetData из консольных приложений, я делал это в нескольких проектах. 17.12.2015
  • Использование источника данных в строке подключения может вызвать проблемы с учетными данными. Лучше использовать имя базы данных. Сервер SQL уже знает местоположение файла базы данных по имени. См. www.connectionstrings.com для всех версий строки подключения. 17.12.2015

Ответы:


1

Вот код, который указывает, где находится |DataDirectory|

GetDataDirectory

[PermissionSet(SecurityAction.Assert, Unrestricted = true)]
internal static string GetDataDirectory() {
    if (HostingEnvironment.IsHosted)
        return Path.Combine(HttpRuntime.AppDomainAppPath, HttpRuntime.DataDirectoryName);

    string dataDir = AppDomain.CurrentDomain.GetData(s_strDataDir) as string;
    if (string.IsNullOrEmpty(dataDir)) {
        string appPath = null;

#if !FEATURE_PAL // FEATURE_PAL does not support ProcessModule
        Process p = Process.GetCurrentProcess();
        ProcessModule pm = (p != null ? p.MainModule : null);
        string exeName = (pm != null ? pm.FileName : null);

        if (!string.IsNullOrEmpty(exeName))
            appPath = Path.GetDirectoryName(exeName);
#endif // !FEATURE_PAL

        if (string.IsNullOrEmpty(appPath))
            appPath = Environment.CurrentDirectory;

        dataDir = Path.Combine(appPath, HttpRuntime.DataDirectoryName);
        AppDomain.CurrentDomain.SetData(s_strDataDir, dataDir, new FileIOPermission(FileIOPermissionAccess.PathDiscovery, dataDir));
    }

    return dataDir;
}
17.12.2015
  • Старый сейчас, но я хотел бы увидеть официальную документацию, описывающую это. Я знаю, что в некотором смысле код даже более авторитетен, но документы действительно являются правильным справочным материалом. 20.04.2017
  • msdn.microsoft.com/en-us/ библиотека/ @JoelCoehoorn 22.04.2017
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..