2015-10-17 57 views
1

我在EF中使用代碼優先的方法。第一次啓動程序時,需要從用戶輸入生成連接字符串。爲EF代碼第一個程序生成連接字符串

這是一個簡單的方法來檢查它是否可以連接現在我試圖得到一些數據,因爲它發生了,這是可以打開測試期間/關閉連接,但得到的任何數據被拋出異常:

public static bool IsConnectionValid(string connectionString) 
    { 
     if (string.IsNullOrWhiteSpace(connectionString)) return false; 
     using (var context = new HolidayCalendarContext(connectionString)) 
     { 
      try 
      { 
       context.Database.Connection.Open(); 
       var contex = context.Employees.ToList(); 
       context.Database.Connection.Close(); 
       return true; 
      } 
      catch (Exception e) 
      { 
       return false; 
      } 
     } 
    } 

現在我在這裏生成的連接字符串,用戶名和密碼是可選的,密碼可以作爲參數以後提供:

private string GenerateConnectionString() 
    { 
     var builder = new SqlConnectionStringBuilder 
     { 
      DataSource = Source, 
      InitialCatalog = Catalog, 
      IntegratedSecurity = true, 
      ConnectTimeout = CONNECTION_TIMEOUT 
     }; 

     if (!string.IsNullOrWhiteSpace(UserName)) 
     { 
      builder.UserID = UserName; 
     } 
     if (!string.IsNullOrWhiteSpace(Password)) 
     { 
      builder.Password = Password; 
     } 
     return builder.ToString(); 
    } 

我測試的方法是綁定到「登錄到數據庫」按鈕的動作。 SaveConnection只是將正確的連接字符串存儲在配置文件中,而ChangeUtility只是導航的東西,在這一點上是不相關的。

private void LoginToDatabaseExecute(object obj) 
    { 
     if (ValidateInput()) 
     { 
      var connectionString = GenerateConnectionString(); 
      if (TestConnection(connectionString)) 
      { 
       SaveConnection(connectionString); 
       ChangeUtility(new LoginViewModel(MainViewModel)); 
      } 
     } 
    } 

所以我有測試生成這些字符串,測試通過。使用調試器進行檢查,它連接並正確地獲取員工:

[TestMethod] 
    public void SuccessfulConnectionStoresConnectionStringInSettings() 
    { 
     SetCorrectConnectionString(); 

     _viewModel.LoginToDatabaseCommand.Execute(null); 

     var connectionString = SettingsHelper.GetConnectionString(); 

     Assert.IsFalse(string.IsNullOrWhiteSpace(connectionString)); 
    } 

private void SetCorrectConnectionString() 
    { 
     _viewModel.Source = "YOGER\\SQLEXPRESS"; 
     _viewModel.Catalog = "HolidayCalendar"; 
     _viewModel.UserName = ""; 
     _viewModel.Password = ""; 
    } 

而這就是問題所在。測試通過後,我啓動的程序,設定相同的輸入,得到了相同的連接字符串從測試"Data Source=YOGER\\SQLEXPRESS; Initial Catalog=HolidayCalendar; Integrated Security=True; Connect Timeout=5"但在連接地方IsConnectionValid試圖打開它的點失敗,拋出"Keyword not supported: 'initial catalog'." System.ArgumentException

Exception thrown: 'System.ArgumentException' in System.Data.SqlServerCe.dll 
Exception thrown: 'System.ArgumentException' in System.Data.dll 

我已經已經嘗試EntityConnectionStringBuilder,但它需要元數據,我發現代碼第一沒有,所以我不知道它的工作。

回答

1

您正在嘗試連接到SQL Express,但從SqlServerCe.dll引發異常。它表明您的程序使用SQL CE的提供程序。

我會在你的app.config文件中檢查entityFramework.defaultConnectionFactory部分。對於SQL Express的它應該被設置爲

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
+0

感謝您的回答。這完全解決了這個問題:] – yoger

0

拋出異常:

在System.Data.SqlServerCe.dll 'System.ArgumentException'

拋出異常:

System.Data.dll中的'System.ArgumentException'

意味着直到您指出SQL Server CE數據庫不在SQL Server Express上