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

3

我有一个小问题。我的应用程序在本地主机上运行一切正常,但是当我将其上传到生产 Web 服务器并想连接数据库时,我只得到了“抱歉,处理您的请求时出现错误。”。当我尝试没有数据库交互的页面时,它可以工作。我正在使用 Entity Framework,但我不确定我的连接字符串是否正确。

这是本地主机的连接字符串:

  <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有一位讲师)。

当我在视图中调用时:

@training.InstructorID

我通常可以获取培训讲师的ID,但是当我调用以下代码时:

@training.Instructor.Fullname

我收到了错误信息。在本地主机上一切正常。有什么想法吗?谢谢。

你确定两个服务器之间的初始目录是不同的吗?通常,无论数据库部署在哪里,数据库名称都是相同的。 - BrokenGlass
1
@Iškuda:是的,这就是数据库名称。同时确保该服务器上的SQL接受远程连接,SQL启用了TCP/IP,防火墙上开放了端口——这些都是常见的问题。 - BrokenGlass
@BrokenGlass 这是标准的IIS托管,我正在尝试部署我的应用程序,所以问题应该出在其他地方。 :-( - Iškuda
你能否使用连接字符串中的值手动连接到数据库? - BrokenGlass
1
顺便提一下,第二个连接字符串没有启用MARS。另外,您的应用程序中有什么日志记录可以获取真正的异常信息? - Ladislav Mrnka
显示剩余2条评论
1个回答

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个子查询 => 这很糟糕,应尽可能避免使用另一种加载技术。例如:

// 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接