我们使用实体框架来读取现有数据库。以下是我们代码的简化版本。
using (my context context = new mycontext())
{
if(context.Database.Connection.State == System.Data.ConnectionState.Closed)
{
_logger.Info(" Opening the connection to the database");
context.Database.Connection.Open();
}
context.Configuration.LazyLoadingEnabled = false;
IQueryable<mymodel> people;
people = context.People.OrderBy(x => x.Firstname);
_lstContacts = people.ToList();
if (context.Database.Connection.State != System.Data.ConnectionState.Closed)
{
context.Database.Connection.Close();
context.Database.Connection.Dispose();
_logger.Info(" Connection to the database Closed");
}
}
它的工作效果一直都是百分之百,但是...... 在我们的UAT环境中,我们可以看到连接到Microsoft SQL服务器的失败连接,并显示以下错误信息:
“登录失败,用户为“my user”。原因:无法打开明确指定的数据库“null”。客户机我的IP。”
对我们来说,这些是幽灵连接,因为当我们在SQL服务器中看到错误时,我们的代码并没有被执行。 最初,我们没有显式地关闭和打开连接,只是添加了它,试图控制EF何时打开和关闭连接,但这并没有解决问题。
我们的连接字符串采用以下格式:
<add name="MYCN" connectionString="metadata=res://*/CVs.Cvs.csdl|res://*/CVs.Cvs.ssdl|res://*/CVs.Cvs.msl;provider=System.Data.SqlClient;provider connection string="data source=myserver\;initial catalog=mydatabase;Integrated Security=;User ID=myuser;Password=XXXXXXX;MultipleActiveResultSets=True;App=EntityFramework"/>
如您所见,我们在连接字符串中指定了数据库,而我们的用户只能访问我们的数据库,因此当EF在连接字符串中不包含该数据库时,我们能理解错误原因,但我们并不明白为什么它尝试执行这些连接。
我们知道这些连接来自我们的应用程序,因为我们是唯一使用该特定用户的人,IP是我们服务器的IP,而且因为SQL Server日志告诉我们应用程序是“EntityFramewrok”