我有点问题。我有应用程序在localhost上运行,一切正常,但是当我将它上传到生产Web服务器并且我想连接数据库时,我只是“抱歉,处理您的请求时出错”。当我尝试没有数据库交互的页面时,它可以工我正在使用Entity Framework,但我不确定连接字符串是否正确。
这是localhost的连接字符串:
<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="Data Source=ISKUDA-NTB\MSSQL;Initial Catalog=KravmagaIS;Integrated Security=True;MultipleActiveResultSets=True"" 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
我获得了训练指导员的身份,但是当我打电话时:
@training.Instructor.Fullname
我收到错误消息。在localhost上一切正常。
有什么想法吗?感谢。
答案 0 :(得分: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;
}
顺便说一下。代码是N + 1问题的示例,因为它将激发1个外部查询,并且对于外部查询的每个结果,它将执行1个内部查询。因此对于来自外部查询的N个结果,它将执行N个子查询=&gt; 这很糟糕,应尽可能避免使用其他加载技术。例如:
// 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;
}