gpt4 book ai didi

c# - |数据目录|的位置如何在连接字符串解决?

转载 作者:行者123 更新时间:2023-11-30 16:50:54 25 4
gpt4 key购买 nike

如果我创建一个 asp.net 项目并使用 Entity Framework 创建一个数据库,像这样的东西会自动添加到 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”文件夹。 Here's一些文档如何解释它:

The presence of User Instance=true and AttachDBFilename=|DataDirectory| cause SqlConnectionHelper to conclude that the connection string targets SQL Server Express and triggers the database's creation. (The presence of data source=.\SQLEXPRESS in the connection string does not factor into the decision, because SqlConnectionHelper supports non-default as well as default instances of SQL Server Express.) The |DataDirectory| portion of the connection string specifies that the MDF file is located inthe App_Data directory. SqlConnectionHelper derives the database name from the MDF file name. It also creates an App_Data folder to hold the MDF if the folder doesn't already exist.

除非,如果我在一个控制台应用程序中使用 Entity Framework,那么这些都不是真的——你只会得到一个异常,说在指定的路径上没有文件,它都会忽略任何 App_Data 您创建的文件夹,没有则创建失败。如果您完全删除 AttachDBFilename 部分,它将起作用,但会在 .exe 文件所在的本地输出箱中创建数据库。 Google tells me您可以使用 AppDomain.SetData 手动设置 |Data Directory|,但显然这对于​​控制台应用程序仍然不正确(出现编译错误,提示“需要对象引用”)。

所以我的问题是,|Data Directory| 的位置究竟是如何解析的?据我所知,控制台应用程序和 Asp.net 应用程序之间的差异意味着解决方案不能仅在 SQL Server Express 中发生,因为两者都使用相同的安装。那么它发生在asp.net服务器中吗?或者是否有在 asp.net 项目中创建的隐藏设置文件?

最佳答案

这是指定 |DataDirectory| 位置的代码

GetDataDirectory

[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;
}

关于c# - |数据目录|的位置如何在连接字符串解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34336899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com