相关疑难解决方法(0)

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

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

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
查看次数

EF:手动调用 OpenConnection 时是否应该显式关闭数据库连接

我在构造函数中打开连接。考虑这段代码:

public abstract class DataContext : DbContext, IDataContext
{
    static DataContext()
    {
        if (DataContextConfiguration.UseSafePersian)
        {
            DbInterception.Add(new SafePersianInterceptor());                
        }
    }

    private readonly bool _saveChangesOnModify = false;

    protected DataContext(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
        this.OpenConnection();
    }
   internal void OpenConnection()
        {
            if (((IObjectContextAdapter)this).ObjectContext.Connection.State != ConnectionState.Open)
                ((IObjectContextAdapter)this).ObjectContext.Connection.Open();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我显式打开连接时是否应该关闭连接?

我用的是Entity Framework版本6。

更新

我收到此错误并且经常发生:

超时已过。从池中获取连接之前超时时间已过。发生这种情况的原因可能是所有池连接都在使用中并且已达到最大池大小。

c# entity-framework entity-framework-6

5
推荐指数
1
解决办法
6089
查看次数