web-dev-qa-db-fra.com

Où est | DataDirectory | défini?

Ceci est une question de suivi de Où est ce fichier sur mon système?

Des tonnes de questions et réponses partout SO et Internet, mais je ne trouve aucun qui donne une réponse à cette question spécifique.

Tout est par défaut mais je ne trouve pas le fichier lui-même,

CE N'EST PAS LÀ .

Où/ comment obtient | DataDirectory | défini ?

Où est enregistré le fichier, existe-t-il même? Sinon, que se passe-t-il?

edit : Le fichier n'est pas situé à AppDomain.CurrentDomain.GetData("DataDirectory").ToString(); toutes les réponses (carrés) me disent que ça devrait être. Il doit être quelque part car le débogueur rompt le harcèlement à propos du modèle qui égalise la table lorsque je change de modèle. Ce n'est pas là.

41
user1555816

Le |DataDirectory| n'est pas un fichier en soi. Une citation de ce plutôt ancien article MSDN (lire l'article complet pour plus de détails):

Par défaut, la variable | DataDirectory | sera développée comme suit:

  • Pour les applications placées dans un répertoire sur la machine utilisateur, ce sera le dossier (.exe) de l'application.
  • Pour les applications exécutées sous ClickOnce, ce sera un dossier de données spécial créé par ClickOnce
  • Pour les applications Web, ce sera le dossier App_Data

Sous le capot, la valeur de | DataDirectory | provient simplement d'une propriété sur le domaine de l'application. Il est possible de modifier cette valeur et de remplacer le comportement par défaut en procédant comme suit:

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

Une autre citation concernant vos incohérences de schéma:

L'une des choses à savoir lorsque vous travaillez avec des fichiers de base de données locaux est qu'ils sont traités comme tout autre fichier de contenu. Pour les projets de bureau, cela signifie que par défaut, le fichier de base de données sera copié dans le dossier de sortie (aka bin) chaque fois que le projet est construit. Après F5, voici à quoi cela ressemblerait sur le disque

 MyProject\Data.mdf

 MyProject\MyApp.vb

 MyProject\Bin\Debug\Data.mdf

 MyProject\Bin\Debug\MyApp.exe

Au moment du design, MyProject\Data.mdf est utilisé par les outils de données. Au moment de l'exécution, l'application utilisera la base de données sous le dossier de sortie. À la suite de la copie, de nombreuses personnes ont l'impression que l'application n'a pas enregistré les données dans le fichier de base de données. En fait, c'est simplement parce qu'il y a deux copies du fichier de données impliquées. Il en va de même lorsque vous examinez le schéma/les données via l'explorateur de base de données. Les outils utilisent la copie dans le projet, pas celle du dossier bin.

64
MicSim

Le | répertoire de données | l'algorithme se trouve dans l'assembly System.Data.dll, dans la classe interne System.Data.Common.DbConnectionOptions. Ici, comme affiché par ILSpy (notez la source, il est maintenant disponible dans le référentiel de source de référence: https://github.com/Microsoft/referencesource/blob/e458f8df6ded689323d4bd1a2a725ad32668aaec/System.Data. Entité/Système/Données/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;
}

Donc, il regarde d'abord dans les données AppDomain actuelles (par défaut, il n'y a pas de données "DataDirectory" définies je crois), puis obtient dans le répertoire de base AppDomain actuel. Le reste consiste principalement à vérifier les racines de chemin et la normalisation des chemins.

16
Simon Mourier

Sur le forum MSDN il y a une question similaire mais simplifiée à ce sujet, qui dit:

Par défaut, le | DataDirectory | pointe vers votre dossier d'application (comme vous l'avez compris vous-même dans la question d'origine: vers App_Data).

Puisqu'il ne s'agit que d'un chemin de substitution vers votre base de données, vous pouvez définir le chemin vous-même avec le AppDomain.SetData .

2
András Ottó