2011-04-18 38 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