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

Где находится | DataDirectory | определены?

Это следующий вопрос Где находится этот файл в моей системе?

Тонны вопросов и ответов по всему SO и интернету, но я не могу найти ответ, который дает ответ на этот конкретный вопрос.

Все по умолчанию, но я не могу найти файл сам,

НЕ ЭТО.

Где/ как получает | DataDirectory | определяется

Где сохранен файл, он даже существует? Если нет, что происходит?

edit. Файл не, расположенный в AppDomain.CurrentDomain.GetData("DataDirectory").ToString(); всех (sqattered) ответах, скажите мне, что это должно быть. Это должно быть где-то, когда отладчик ломается, показывая, что модель неравнозначна таблице, когда я меняю модель. Он не.

4b9b3361

Ответ 1

|DataDirectory| не является файлом как таковым. Цитата из этой старой статьи MSDN (подробнее читайте в полной статье):

По умолчанию переменная | DataDirectory | будет расширена следующим образом:

  • Для приложений, помещенных в каталог на компьютере пользователя, это будет папка приложения (.exe).
  • Для приложений, работающих под ClickOnce, это будет специальная папка данных, созданная ClickOnce
  • Для веб-приложений это будет папка App_Data​​li >

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

AppDomain.CurrentDomain.SetData("DataDirectory", newpath)

Еще одна цитата о несоответствиях вашей схемы:

Одна из вещей, которые нужно знать при работе с локальными файлами базы данных, заключается в том, что они рассматриваются как любые другие файлы содержимого. Для настольных проектов это означает, что по умолчанию файл базы данных будет копироваться в выходную папку (aka bin) каждый раз, когда будет создан проект. После F5, вот что он будет выглядеть на диске

 MyProject\Data.mdf

 MyProject\MyApp.vb

 MyProject\Bin\Debug\Data.mdf

 MyProject\Bin\Debug\MyApp.exe

Во время разработки MyProject\Data.mdf используется инструментами данных. Во время выполнения приложение будет использовать базу данных в выходной папке. В результате копирования многие люди создают впечатление, что приложение не сохраняет данные в файле базы данных. Фактически, это просто потому, что есть две копии файла данных. То же самое относится при просмотре схемы/данных через проводник базы данных. Инструменты используют копию в проекте, а не ту, что находится в папке bin.

Ответ 2

Каталог | datadirectory | Алгоритм находится в сборке System.Data.dll во внутреннем классе System.Data.Common.DbConnectionOptions. Здесь он отображается ILSpy (обратите внимание на источник, который теперь доступен в репозитории исходного источника: https://github.com/Microsoft/referencesource/blob/e458f8df6ded689323d4bd1a2a725ad32668aaec/System.Data.Entity/System/Data/EntityClient/DbConnectionOptions.cs):

internal static string ExpandDataDirectory(string keyword,
                                           string value,
                                           ref string datadir)
{
    string text = null;
    if (value != null && 
        value.StartsWith("|datadirectory|", StringComparison.OrdinalIgnoreCase))
    {
        string text2 = datadir;
        if (text2 == null)
        {
            // 1st step!
            object data = AppDomain.CurrentDomain.GetData("DataDirectory");
            text2 = (data as string);
            if (data != null && text2 == null)
                throw ADP.InvalidDataDirectory();

            if (ADP.IsEmpty(text2))
            {
                // 2nd step!
                text2 = AppDomain.CurrentDomain.BaseDirectory;
            }
            if (text2 == null)
            {
                text2 = "";
            }
            datadir = text2;
        }

        // 3rd step, checks and normalize
        int length = "|datadirectory|".Length;
        bool flag = 0 < text2.Length && text2[text2.Length - 1] == '\\';
        bool flag2 = length < value.Length && value[length] == '\\';
        if (!flag && !flag2)
        {
            text = text2 + '\\' + value.Substring(length);
        }
        else
        {
            if (flag && flag2)
            {
                text = text2 + value.Substring(length + 1);
            }
            else
            {
                text = text2 + value.Substring(length);
            }
        }
        if (!ADP.GetFullPath(text).StartsWith(text2, StringComparison.Ordinal))
            throw ADP.InvalidConnectionOptionValue(keyword);
    }
    return text;
}

Таким образом, он сначала отображает текущие данные AppDomain (по умолчанию, нет данных DataDirectory, которые, как я полагаю), а затем попадает в текущий базовый каталог AppDomain. Остальное в основном проверяет корни путей и нормализацию путей.

Ответ 3

На форуме MSDN есть аналогичный, но упрощенный вопрос об этом, в котором говорится:

По умолчанию | DataDirectory | указывает на вашу папку приложений (как вы выяснили себя в исходном вопросе: в App_Data).

Так как это всего лишь путь подстановки к вашей базе данных, вы можете определить путь самостоятельно с помощью AppDomain.SetData​​strong > .