47

これは、システム上のそのファイルはどこにありますか?のフォローアップの質問です。

SOとインターネット全体にたくさんの質問と回答がありますが、この特定の質問に対する回答が見つかりません。

すべてがデフォルトですが、ファイル自体が見つかりません。

そこにはありません

|DataDirectory| を取得する場所/方法 定義された?

ファイルはどこに保存されていますか、それは存在しますか? そうでない場合、何が起こっているのですか?

編集:ファイルはまったく配置されAppDomain.CurrentDomain.GetData("DataDirectory").ToString();ていません(散らばっています)答えは、そうあるべきだと教えてくれます。モデルを変更すると、モデルがテーブルと等しくないことについてデバッガーがしつこく壊れるので、どこかにあるに違いありません。そこにはありません

4

3 に答える 3

72

それ|DataDirectory|自体はファイルではありません。かなり古い MSDN 記事からの引用:

デフォルトでは、|DataDirectory| 変数は次のように展開されます。

  • ユーザー コンピューターのディレクトリに配置されたアプリケーションの場合、これはアプリの (.exe) フォルダーになります。
  • ClickOnce で実行されているアプリの場合、これは ClickOnce によって作成された特別なデータ フォルダーになります。
  • Web アプリの場合、これは App_Data フォルダーになります。

内部では、 |DataDirectory|の値 単純にアプリ ドメインのプロパティから取得されます。これを行うことで、その値を変更してデフォルトの動作をオーバーライドすることができます。

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

スキーマの不一致に関するさらなる引用:

ローカル データベース ファイルを操作する際に知っておくべきことの 1 つは、それらが他のコンテンツ ファイルと同様に扱われることです。デスクトップ プロジェクトの場合、既定では、プロジェクトがビルドされるたびにデータベース ファイルが出力フォルダー (別名 bin) にコピーされることを意味します。F5 の後、ディスク上では次のようになります。

 MyProject\Data.mdf

 MyProject\MyApp.vb

 MyProject\Bin\Debug\Data.mdf

 MyProject\Bin\Debug\MyApp.exe

設計時に、MyProject\Data.mdf はデータ ツールによって使用されます。実行時に、アプリは出力フォルダーの下のデータベースを使用します。コピーの結果、アプリがデータをデータベース ファイルに保存しなかったという印象を多くの人が持っています。実際、これは単純に、関連するデータ ファイルのコピーが 2 つあるためです。データベース エクスプローラーでスキーマ/データを参照する場合も同様です。ツールは、bin フォルダー内のコピーではなく、プロジェクト内のコピーを使用しています。

于 2012-09-05T07:36:12.717 に答える
17

|データディレクトリ| アルゴリズムは、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ベースディレクトリに到達します。残りは主にパスルートとパス正規化のチェックです。

于 2012-09-06T09:00:00.243 に答える
2

MSDN フォーラムには、これに関する同様の単純化された質問があり、次のように書かれています。

デフォルトでは |DataDirectory| アプリケーションフォルダーを指します(元の質問で自分自身を理解したように:App_Dataへ)。

はデータベースへの単なる代替パスであるため、 AppDomain.SetDataを使用して自分でパスを定義できます。

于 2012-09-05T05:45:47.400 に答える