2014-09-23 64 views
3

背景

我正在處理一個包含遺留代碼和實體框架代碼的項目。我被建議使用特定的數據服務方法來處理來自數據庫的記錄。記錄是通過實體框架檢索的,我將PK傳遞到dataservice函數中執行操作。使用實體框架和SqlConnection?

前提對成功和失敗

如果網絡是高達,既DB調用(實體SQL)會成功。 如果網絡出現故障,然後回來並執行此代碼,那麼它將檢索帶有實體框架的鎖定記錄,但隨後失敗,並顯示下面的SqlException

這讓我想到,這裏發生了什麼,可能導致SqlConnection失敗,儘管EF能夠建立連接。

代碼示例

一個代碼示例如下:

public void HandleNetworkBecomesAvailable() { 
    _entityFrameworkDataService.ReleaseRecords(); 
} 

EntityFrameworkDataService.cs

public void ReleaseRecords() 
    { 
     using (var context = new Entities()) // using EntityConnection 
     { 
      var records = context.Records.Where(
       record => record.IsLocked).ToList(); 

      foreach (var record in records) 
      { 
       _sqlConnectionDataService.UnlockRecord(record.ID); 
      } 
     } 
    } 

SqlConnectionDataService.cs

public void UnlockRecord(int recordId) 
    { 
     using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Sqlconnection"].ConnectionString)) 
     { 
      connection.Open(); 

      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = @"UPDATE [Records] SET [IsLocked] = 0"; 
       //etc 

       command.ExecuteNonQuery(); 
      } 
     } 
    } 

的App.config

<add name="EntityConnection" connectionString="metadata=res://*/FooDatabase.csdl|res://*/FooDatabase.ssdl|res://*/FooDatabase.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=RemoteServer;initial catalog=FooDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
<add name="SqlConnection" connectionString="Server=RemoteServer;Database=FooDatabase;Trusted_Connection=True" /> 

現在,在與我的同事討論後,我最終將邏輯轉移到實體框架dataservice中,並在那裏進行工作。但是我仍然不確定爲什麼連接失敗。

編輯:實際的錯誤是:

An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll but was not handled in user code

Additional information: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

Inner Exception:

The network path was not found

但實體框架是使用相同的網絡路徑,可以在App.config兩個連接字符串中可以看出。

+1

什麼是異常的實際消息文本?有沒有內在的例外? – 2014-09-23 16:04:33

+0

看來服務器無法聯繫到,您確定使用的連接字符串是否正常? – pollirrata 2014-09-23 16:12:01

+0

這個異常基本上說它不能使用你提供的連接字符串連接到sql server。如果你斷斷續續地發現它代表網絡問題,而不是代碼中的任何東西。如果你一致地得到它,那麼你使用的連接字符串是錯誤的。 – 2014-09-23 16:13:14

回答

1

您是否可以從實體框架的新彈性中獲益?在哪裏它透明地重試?如果錯誤是間歇性的,你甚至不會知道它重試了,而ADO.net讓你知道它一旦失敗就會失敗。只是檢查...

+0

我傾向於相信這一點,因爲我知道實體框架做了某種形式的自定義連接管理。你能提供任何可能提供證據表明這種情況正在發生的鏈接嗎? – 2014-09-23 17:28:01

+0

我唯一擔心的是隻有在實體框架查詢成功時纔會發生sql查詢,這意味着連接必須可用。 – 2014-09-23 18:05:40

+0

您爲多個活動結果集設置了什麼值? – reckface 2014-09-23 18:17:57