2013-02-23 63 views
8

当使用WPF和实体框架我有一个看起来像一个app.config如下:%连接字符串中的APPDATA%未替换实际文件夹?

<?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> 

使用此代码时它总是引发以下错误:

System.Data.EntityException: The underlying provider failed on Open. ---> System.Data.SqlServerCe.SqlCeException: The path is not valid. Check the directory for the database. [ Path = %APPDATA%\Folder\Database.sdf ] 

当我运行路径“%APPDATA%\ Folder \ Database.sdf”从命令提示符它工作正常,如果我删除“%APPDATA%和硬编码路径它工作正常 - 所以它看起来就像%APPDATA%只是没有被替换为实际文件夹...

谢谢,

+1

在你的连接字符串中使用'| DataDirectory |'而不是'%APPDATA%'让我知道它是否解决了你的问题。 – 2013-02-23 07:32:00

回答

21

正如您已经重新调整,%APPDATA%或任何其他环境变量不会被替换为它们各自在连接字符串中的值。环境变量是与操作系统shell相关的东西。它们在命令提示符下工作,因为命令提示符显式分析输入的值并替换环境变量。这不是.NET Framwork通常执行的事情。

要实现此目的,您必须手动提供%APPDATA%的值(使用Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)Environment.GetEnvironmentVariable("APPDATA"))。有两个选项:

  1. 更改连接字符串,并使用|DataDirectory|:(注意在路径数据库文件的使用|DataDirectory|

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

    然后提供的价值为|DataDirectory|在您的应用程序的主要方法:

    AppDomain.CurrentDomain.SetData("DataDirectory", 
        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); 
    

    请参阅this MSDN page for more information

  2. 手动为您的ObjectContext类提供连接字符串。这样,您就可以解析和更改连接字符串:

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

    和使用任何地方的新课程。

+0

这是我第一次使用entity-framework,并且老实说我找不到任何代码读取ConnectionString的地方,因此没有我在那里做的.Replace for APPDATA。在开始时,我使用ConfigurationManager来读取它,然后看着保存它,但看到该文件在\ Programs Files \下,我没有权利更改它...? – JSchwartz 2013-02-23 07:11:50

+0

@JSchwartz我已经添加了所有必需的信息。 – 2013-02-23 11:45:30

+0

您好我使用Visual Studio 2013,名称空间'System.Configuration'中不存在类型或名称空间名称'ConfigurationManager'(您是否缺少程序集引用?) – Cyberguille 2015-08-14 18:24:41

1

你必须与相对路径的代码替换%APPDATA% -

var connectionString = ConfigurationManager.ConnectionStrings["DatabaseEntities"] 
                  .ConnectionString;  
connectionString.Replace("%APPDATA%", 
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
4

我有另一种选择。我们不需要替换任何东西。我使用下面的连接字符串,没有任何替换,它工作正常。

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

主要的变化是data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|DataDirectory|\ProjectManagementDB.mdf;integrated security=True;

我希望这将节省的人。

相关问题