繁体   English   中英

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

[英]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|

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM