小编Vic*_*ana的帖子

如何通过实体框架避免针对空/空数据库的连接

我们使用实体框架从现有数据库中读取。这是我们代码的简化版本。

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以100%地起作用,但是...在我们的UAT环境中,我们可以看到与Microsoft SQL Server的连接失败,并显示以下错误:

用户“我的用户”的登录失败。原因:无法打开显式指定的数据库“空”。客户我的IP。

对我们来说,这些是虚连接,因为在我们看到SQL Server中的错误时,我们的代码没有执行。最初,我们没有明确关闭并打开连接,我们只是添加了它以控制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"/>
Run Code Online (Sandbox Code Playgroud)

如您所见,我们在连接字符串中指定数据库,而我们的用户只能访问我们的数据库,因此当EF在连接字符串中不包含数据库时,我们会理解该错误,但是我们不知道为什么它是尝试执行这些连接。我们知道连接来自我们的应用程序,因为我们是唯一使用该特定用户的连接,IP是服务器的IP,并且因为SQL Server中的日志告诉我们该应用程序是“ EntityFramewrok”

.net c# sql-server entity-framework entity-framework-6

6
推荐指数
1
解决办法
278
查看次数