C# %连接字符串中的APPDATA%未替换为实际文件夹?
使用WPF和实体框架时,我有一个APP.CONFIG,如下所示:C# %连接字符串中的APPDATA%未替换为实际文件夹?,c#,wpf,entity-framework,sql-server-ce,C#,Wpf,Entity Framework,Sql Server Ce,使用WPF和实体框架时,我有一个APP.CONFIG,如下所示: <?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> <add name="DatabaseEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;pr
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="DatabaseEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlServerCe.4.0;provider connection string="Data Source=%APPDATA%\Folder\Database.sdf"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
当我从命令提示符下运行路径“%APPDATA%\Folder\Database.sdf”时,它可以正常工作,如果我删除“%APPDATA%”并对路径进行硬编码,它也可以正常工作-因此看起来只是%APPDATA%没有被实际的文件夹所取代
谢谢,正如您已经实现的,
%APPDATA%
或任何其他环境变量都不会替换为它们在连接字符串中各自的值。环境变量与操作系统外壳程序相关。它们在命令提示符下工作,因为命令提示符显式解析输入和替换的值tes环境变量。这不是.NETFramWork通常执行的功能
要实现此目的,必须手动提供%APPDATA%
(使用环境.GetFolderPath(环境.SpecialFolder.ApplicationData)
或环境.GetEnvironmentVariable(“APPDATA”)
)的值。有两个选项:
|数据目录|
:
<connectionStrings>
<add name="DatabaseEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlServerCe.4.0;provider connection string="Data Source=|DataDirectory|\Database.sdf"" providerName="System.Data.EntityClient" />
</connectionStrings>
参考public static string GetConnectionString()
{
var conStr = System.Configuration.ConfigurationManager.ConnectionStrings["DatabaseEntities"].ConnectionString;
return conStr.Replace("%APPDATA%",
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
}
public class MyDatabaseEntities : DatabaseEntities
{
public MyDatabaseEntities()
: base(GetConnectionString())
{
}
public static string GetConnectionString()
{
var conStr = System.Configuration.ConfigurationManager.ConnectionStrings["DatabaseEntities"].ConnectionString;
return conStr.Replace("%APPDATA%",
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
}
}
后来:
var db = new DatabaseEntities(GetConnectionString());
或子类化您的ObjectContext
类,并始终使用新的连接字符串:
public static string GetConnectionString()
{
var conStr = System.Configuration.ConfigurationManager.ConnectionStrings["DatabaseEntities"].ConnectionString;
return conStr.Replace("%APPDATA%",
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
}
public class MyDatabaseEntities : DatabaseEntities
{
public MyDatabaseEntities()
: base(GetConnectionString())
{
}
public static string GetConnectionString()
{
var conStr = System.Configuration.ConfigurationManager.ConnectionStrings["DatabaseEntities"].ConnectionString;
return conStr.Replace("%APPDATA%",
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
}
}
并在任何地方使用新类您必须将代码中的
%APPDATA%
替换为相对路径-
var connectionString = ConfigurationManager.ConnectionStrings["DatabaseEntities"]
.ConnectionString;
connectionString.Replace("%APPDATA%",
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
我有另一个选择。我们不需要替换任何东西。我正在使用下面的连接字符串,没有任何替换,它工作正常
<connectionStrings>
<add name="ProjectManagementDBEntities" connectionString="metadata=res://*/Models.ProjectManagementModels.csdl|res://*/Models.ProjectManagementModels.ssdl|res://*/Models.ProjectManagementModels.msl;provider=System.Data.SqlClient;provider connection string="data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|DataDirectory|\ProjectManagementDB.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient"/>
</connectionStrings>
主要更改是datasource=(LocalDB)\MSSQLLocalDB;attachdbfilename=| DataDirectory |\ProjectManagementDB.mdf;integratedsecurity=True;
我希望这能拯救一些人。这是我第一次使用实体框架,老实说,我找不到任何读取连接字符串的代码,因此我没有地方为APPDATA执行.Replace。在开始时,我使用ConfigurationManager将其读入,然后查看是否将其保存回来,但看到文件在\Programs下文件\n我无权更改它…?您好,我使用Visual Studio 2013,命名空间“System.Configuration”(是否缺少程序集引用?)中不存在类型或命名空间名称“ConfigurationManager”@Cyberguille您是否使用完整的类名(
System.Configuration.ConfigurationManager
)在我的代码中,或者仅仅是ConfigurationManager
?您没有忘记在代码顶部添加using System.Configuration;
吗?我忘记了添加using System.Configuration;在我的代码顶部,感谢您花时间@mohammaddehang重要的是,请注意“DataDrectory”是一个特定的术语-您不能像您一样选择自己的值可以输入连接名称等。但是,它不区分大小写。在连接字符串中使用|DataDirectory |
而不是%APPDATA%
让我知道它是否解决了您的问题。