2011-04-18 68 views
2

我有一個小問題。我有在本地主機上運行的應用程序,一切正常,但是當我將其上傳到生產Web服務器並且我想連接數據庫時,我只是「對不起,處理您的請求時發生錯誤。」。當我嘗試頁面沒有數據庫交互時,它的作品。我正在使用實體框架,但我不確定我的連接字符串是否正確。實體框架部署 - 連接字符串

這是本地主機連接字符串:

<connectionStrings> 
    <add name="ApplicationServices" connectionString="data source=localhost\MSSQL;Integrated Security=SSPI;Initial Catalog=KravmagaIS" /> 
    <add name="KravmagaISEntities" connectionString="metadata=res://*/Models.KravmagaModel.csdl|res://*/Models.KravmagaModel.ssdl|res://*/Models.KravmagaModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=ISKUDA-NTB\MSSQL;Initial Catalog=KravmagaIS;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

,這是一個生產服務器:

<connectionStrings> 
    <add name="ApplicationServices" connectionString="Data Source=192.168.1.5;User ID=db3542;Password=****;Initial Catalog=db3542" /> 
    <add name="KravmagaISEntities" connectionString="metadata=res://*/Models.KravmagaModel.csdl|res://*/Models.KravmagaModel.ssdl|res://*/Models.KravmagaModel.msl;provider=System.Data.SqlClient;provider connection string='Data Source=192.168.1.5;User ID=db3542;Password=*****;Initial Catalog=db3542'" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

有沒有搞錯?我確定密碼是正確的。

感謝您的幫助。

編輯:

對不起我的錯誤。 : - /連接正常。但是生產服務器中的關係是問題的原因。

我有類Training和類Instructor。 (培訓有一名教練)。

當我打電話鑑於:

@training.InstructorID 

我得到normaly培訓講師的ID,但是當我打電話:

@training.Instructor.Fullname 

我得到的錯誤信息。本地主機是一切正常工作。

任何想法?謝謝。

+0

您確定兩個服務器之間的初始目錄不同嗎?通常DB *名稱*是相同的,無論數據庫在哪裏部署 – BrokenGlass 2011-04-18 12:47:16

+0

初始目錄與數據庫名稱相似,對嗎?由於本地主機上的數據庫名稱是KravmagaIS,在託管服務器上是db3542。 – 2011-04-18 12:55:50

+1

@Iškuda:是的,它是數據庫名稱。此外,請確保該服務器上的SQL正在接受遠程連接,在SQL中啓用了TCP/IP,該端口在防火牆上打開 - 通常候選人 – BrokenGlass 2011-04-18 12:58:23

回答

2

我想在你的開發環境中運行相同的代碼,所以它不應該是你的代碼的問題。還因爲你提到Training被加載,它不應該是連接到數據庫服務器的問題。

它看起來像延遲加載不工作,可以回到我以前的說明,在生產連接字符串中未啓用MARS(MultipleActiveResultSets)。 MARS允許您從循環中的一個查詢讀取結果,並同時執行另一個查詢以獲取詳細信息。典型的例子是:

// Executes something kile SELECT * FROM Trainings and has opened 
// DataReated for the whole duration of the loop. 
foreach(var training in context.Trainings) 
{ 
    // Executes something like SELECT * FROM Instructors WHERE Id = @Id 
    // and opens its own DataReader to get the result. 
    // If MARS is not enabled or not supported you will get an exception 
    var fullName = training.Instructor.FullName; 
} 

Btw。該代碼就是N + 1問題的示例,因爲它將取消1個外部查詢,並且對於每個外部查詢的結果,它將執行1個內部查詢。因此,對於來自外部查詢的N個結果,您將執行N個子查詢=>這是不好的,應儘可能地避免使用其他加載技術。例如:

// Loads both trainings ana related instructors in the same query. 
foreach(var training in context.Trainings.Include("Instructor")) 
{ 
    // No query is executed here because instructor is already loaded. 
    var fullName = training.Instructor.FullName; 
} 
+0

這就是它!非常感謝,讓MARS解決了我的問題。 – 2011-04-18 21:00:55