Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# %连接字符串中的APPDATA%未替换为实际文件夹?_C#_Wpf_Entity Framework_Sql Server Ce - Fatal编程技术网

C# %连接字符串中的APPDATA%未替换为实际文件夹?

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

使用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;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=%APPDATA%\Folder\Database.sdf&quot;" 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=&quot;Data Source=|DataDirectory|\Database.sdf&quot;" providerName="System.Data.EntityClient" />
    </connectionStrings>
    
    参考

  • 手动为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));
        }
    }
    
    后来:

    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=&quot;data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|DataDirectory|\ProjectManagementDB.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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%
    让我知道它是否解决了您的问题。