在哪里| DataDirectory | 界定?

42 sql database asp.net-mvc entity-framework vwdexpress

这是我的系统上该文件的位置的后续问题

在SO和互联网上有大量的问答,但我找不到任何可以回答这个具体问题的答案.

全部是默认的,但我找不到文件本身,

它不在那里.

在哪里/ 如何获取| DataDirectory | 定义

文件保存在哪里,它是否存在?如果没有,发生了什么?

编辑:文件根本没有找到AppDomain.CurrentDomain.GetData("DataDirectory").ToString();(sqattered)答案告诉我它应该是.它必须在某个地方,因为当我更改模型时,调试器打破了模型的不平等.它不在那里.

Mic*_*Sim 64

|DataDirectory|本身不是文件.来自这篇相当古老的MSDN文章的引用(详情请阅读完整文章):

默认情况下,| DataDirectory | 变量将扩展如下:

  • 对于放置在用户计算机上的目录中的应用程序,这将是应用程序的(.exe)文件夹.
  • 对于在ClickOnce下运行的应用程序,这将是ClickOnce创建的特殊数据文件夹
  • 对于Web应用程序,这将是App_Data文件夹

在引擎盖下,| DataDirectory |的值 只是来自应用领域的属性.可以通过执行以下操作来更改该值并覆盖默认行为:

AppDomain.CurrentDomain.SetData("DataDirectory", newpath)
Run Code Online (Sandbox Code Playgroud)

关于架构不一致的进一步引用:

使用本地数据库文件时需要了解的一点是,它们被视为任何其他内容文件.对于桌面项目,这意味着默认情况下,每次构建项目时,数据库文件都将复制到输出文件夹(也就是bin).在F5之后,这是它在磁盘上的样子

 MyProject\Data.mdf

 MyProject\MyApp.vb

 MyProject\Bin\Debug\Data.mdf

 MyProject\Bin\Debug\MyApp.exe
Run Code Online (Sandbox Code Playgroud)

在设计时,数据工具使用MyProject\Data.mdf.在运行时,应用程序将使用输出文件夹下的数据库.作为副本的结果,许多人的印象是应用程序没有将数据保存到数据库文件中.实际上,这只是因为涉及的数据文件有两个副本.通过数据库资源管理器查看架构/数据时也是如此.这些工具使用项目中的副本,而不是bin文件夹中的副本.

  • 当你的答案进来时输入答案已经过了一半.研究得很好! (3认同)

Sim*_*ier 16

| datadirectory | algorithm位于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;
}
Run Code Online (Sandbox Code Playgroud)

所以它首先查看当前的AppDomain数据(默认情况下,我认为没有定义"DataDirectory"数据),然后进入当前的AppDomain基目录.其余的主要是检查路径根和路径规范化.


And*_*ttó 2

MSDN 论坛上有一个类似但简化的问题,它说:

默认情况下 |DataDirectory| 指向您的应用程序文件夹(正如您在原始问题中发现的那样:指向 App_Data)。

由于它只是数据库的替换路径,因此您可以使用 AppDomain.SetData 自行定义路径