[英]How is location of |Data Directory| in connection strings resolved?
如果我创建一个asp.net项目并使用实体框架来创建数据库,这样的东西会自动添加到web.config
的连接字符串中:
<add name="DefaultConnection" connectionString="data source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\WebAppName.mdf;initial catalog=WebAppName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
请注意,它使用“ |Data Directory|
而不是完全限定的文件路径 在这种情况下,它指向'App_Data`文件夹。 以下是一些文档解释的方法:
User Instance = true和AttachDBFilename = | DataDirectory |的存在 导致SqlConnectionHelper断定连接字符串以SQL Server Express为目标并触发数据库的创建。 (连接字符串中数据源=。\\ SQLEXPRESS的存在不会影响决策,因为SqlConnectionHelper支持SQL Server Express的非默认实例和默认实例。)| DataDirectory | 连接字符串的一部分指定MDF文件位于App_Data目录中。 SqlConnectionHelper从MDF文件名派生数据库名称。 如果文件夹尚不存在,它还会创建一个App_Data文件夹来保存MDF。
除此之外,如果我在控制台应用程序中使用实体框架,那么这一切都不是真的 - 你只会得到一个异常,说明指定路径上没有文件,它将忽略你创建的任何App_Data
文件夹并失败如果没有,则创建一个。 如果您完全删除AttachDBFilename
部分,它将工作,但将在.exe
文件所在的本地输出bin中创建数据库。 谷歌告诉我你可以手动设置|Data Directory|
使用AppDomain.SetData
但显然对于控制台应用程序仍然不正确(获得编译错误,说“需要对象引用”)。
所以我的问题是, |Data Directory|
的位置究竟如何 得到解决? 据我所知,控制台应用程序和Asp.net应用程序之间存在差异这一事实意味着解决方案不能仅在SQL Server Express中发生,因为两者都使用相同的安装。 它是否发生在asp.net服务器上? 或者是否有一个隐藏的设置文件在asp.net项目中创建?
这是代码,它指定了|DataDirectory|
[PermissionSet(SecurityAction.Assert, Unrestricted = true)]
internal static string GetDataDirectory() {
if (HostingEnvironment.IsHosted)
return Path.Combine(HttpRuntime.AppDomainAppPath, HttpRuntime.DataDirectoryName);
string dataDir = AppDomain.CurrentDomain.GetData(s_strDataDir) as string;
if (string.IsNullOrEmpty(dataDir)) {
string appPath = null;
#if !FEATURE_PAL // FEATURE_PAL does not support ProcessModule
Process p = Process.GetCurrentProcess();
ProcessModule pm = (p != null ? p.MainModule : null);
string exeName = (pm != null ? pm.FileName : null);
if (!string.IsNullOrEmpty(exeName))
appPath = Path.GetDirectoryName(exeName);
#endif // !FEATURE_PAL
if (string.IsNullOrEmpty(appPath))
appPath = Environment.CurrentDirectory;
dataDir = Path.Combine(appPath, HttpRuntime.DataDirectoryName);
AppDomain.CurrentDomain.SetData(s_strDataDir, dataDir, new FileIOPermission(FileIOPermissionAccess.PathDiscovery, dataDir));
}
return dataDir;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.