c# - 如何避免 Entity Framework 对空/空数据库的连接

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

我们使用 Entity Framework 从现有数据库中读取数据。 这是我们代码的简化版本。

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");
    }
}

它在 100% 的时间内都有效,但是... 在我们的 UAT 环境中,我们可以看到与 Microsoft SQL Server 的连接失败并出现以下错误:

Login failed for user "my user". Reason: Failed to open the explicitly specified database "null". Client my 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 未在连接字符串中包含数据库时,我们理解错误,但我们不这样做了解它为什么要尝试执行这些连接。 我们知道连接来 self 们的应用程序,因为我们是唯一使用该特定用户的应用程序,IP 是我们服务器的 IP,并且因为 SQL Server 中的日志告诉我们该应用程序是“EntityFramewrok”

最佳答案

我之前没有亲眼看到这个错误,但是为你研究了一下,看到很多人都遇到了这里讨论的同样的问题:https://blogs.msdn.microsoft.com/sql_protocols/2006/02/21/understanding-login-failed-error-18456-error-messages-in-sql-server-2005/

我阅读了指定网站上的所有消息,这里是提供的解决方案,至少有一位其他用户确认它有效。您可能不会使用 2005,因为您没有在问题中指定您的版本,我相信一些解决方案仍然适用于您。试试下面的列表。

解决方案列表:

1) 请查看此错误的状态编号,并根据消息中的状态编号搜索解决方案,可能会给您更准确的解决方案建议。列出了最常见的状态: List item

您可以在此处找到所有状态错误描述:https://sqlblog.org/2011/01/14/troubleshooting-error-18456

2) 确保用户名和密码正确。

3)

  • 使用 Windows 身份验证登录到 SQL Server。
  • 在出现的查询窗口中右击并选择“在对象资源管理器中打开服务器”
  • 转到对象资源管理器并打开“安全”文件夹,然后打开“登录”文件夹。
  • 双击“sa”用户并更改密码。另外,像上面提到的另一个用户一样,取消勾选中的“强制密码策略” 除了重置密码。

4) 尝试更改密码并关闭策略,然后尝试使用新密码。

exec sp_password @new = ‘sqlpassword’, @loginame = ‘sa’
alter login sa
with password = ‘sqlpassword’ unlock,
check_policy = off,
check_expiration = off

5) 在管理模式下运行您的应用程序/浏览器和 SSMS(如果您正在使用它)。

6)

  • 打开 Windows 服务
  • 配置 Microsoft 单一登录服务以使用正确的帐户
  • 打开管理中心 >> 操作 >> 管理单点登录设置
  • 将属性配置为使用与 Microsoft“单点登录服务”相同的帐户

7) 转到 Sql server 配置管理器并启用 TCP/IP 和命名管道

8)

  • 转到sql server
  • 右键单击服务器,选择属性
  • 点击安全
  • 在服务器身份验证上,启用 SQL Server 身份验证

这些可能有帮助:

https://www.wikitechy.com/errors-and-fixes/sql/login-failed-error-18456-severity-14-state-38-reason-failed-to-open-the-explicitly-specified-database

https://dba.stackexchange.com/questions/90445/login-failed-for-user-error-18456-severity-14-state-38

关于c# - 如何避免 Entity Framework 对空/空数据库的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57159592/

相关文章:

c# - MYSQL 空值干扰 C# 应用程序

sql-server - SQL Server 数据库恢复失败 - 版本冲突

mysql - SQL Server : date incompatible with int when migrating from mysql. 如何解决?

c# - 如何在 C# 中设置 PropertyGrid 项的长度?

c# - C#:String.IndexOf到FileStream.Seek

c# - 使用 EF6 和 SQL Server 2012 时是否有替代方法来引用表?

c# - 扩展方法对子类不起作用?

c# - 将参数传递给用户控件

c# - Winforms 文本框的焦点丢失事件?

mysql - 在 SQL 中形成 Case 语句