实体框架部署 - 连接字符串

时间:2011-04-18 12:35:20

标签: entity-framework asp.net-mvc-3

我有点问题。我有应用程序在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=&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

我获得了训练指导员的身份,但是当我打电话时:

@training.Instructor.Fullname

我收到错误消息。在localhost上一切正常。

有什么想法吗?感谢。

1 个答案:

答案 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;
}