这是Where is that file on my system?
的后续问题在SO和互联网上有很多问题和答案,但我找不到任何可以回答这个具体问题的答案。
全部是默认的,但我找不到文件本身,
在哪里/ 如何获取| DataDirectory |的定义
文件保存在哪里,它是否存在?如果没有,发生了什么?
修改:文件不是位于AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
所有(sqattered)答案告诉我它应该是。它必须在某个地方,因为当我更改模型时,调试器打破了模型的不平等。那里不。
答案 0 :(得分:62)
|DataDirectory|
本身不是文件。来自rather old MSDN article的引用(详情请阅读完整文章):
默认情况下, | DataDirectory | 变量将按以下方式展开:
- 对于放置在用户计算机上的目录中的应用程序,这将是应用程序的(.exe)文件夹。
- 对于在ClickOnce下运行的应用,这将是ClickOnce
创建的特殊数据文件夹- 对于Web应用程序,这将是App_Data文件夹
在幕后, | DataDirectory | 的值只来自应用领域的属性。可以通过执行以下操作来更改该值并覆盖默认行为:
AppDomain.CurrentDomain.SetData("DataDirectory", newpath)
关于架构不一致的进一步引用:
使用本地数据库文件时需要了解的一点是,它们被视为任何其他内容文件。对于桌面项目,这意味着默认情况下,每次构建项目时,数据库文件都将复制到输出文件夹(也就是bin)。在F5之后,这就是它在磁盘上的样子
MyProject\Data.mdf MyProject\MyApp.vb MyProject\Bin\Debug\Data.mdf MyProject\Bin\Debug\MyApp.exe
在设计时,数据工具使用MyProject \ Data.mdf。在运行时,应用程序将使用输出文件夹下的数据库。作为副本的结果,许多人的印象是应用程序没有将数据保存到数据库文件中。实际上,这只是因为涉及的数据文件有两个副本。通过数据库资源管理器查看架构/数据时也是如此。这些工具正在使用项目中的副本,而不是bin文件夹中的副本。
答案 1 :(得分:15)
| 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;
}
因此它首先查看当前的AppDomain数据(默认情况下,我认为没有定义“DataDirectory”数据),然后转到当前的AppDomain基目录。其余的主要是检查路径根和路径规范化。
答案 2 :(得分:2)
在MSDN forum上有一个类似但简化的问题,其中说:
默认情况下为| DataDirectory |指向您的应用程序文件夹(正如您在原始问题中找到的那样:到App_Data)。
由于它只是数据库的替换路径,因此您可以使用 AppDomain.SetData 自行定义路径。