2013-02-23 35 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;

我希望這將節省的人。

相關問題