Entity Framework 5 DbContext如何管理数据库连接?

时间:2013-07-28 04:51:16

标签: entity-framework

在asp.net mvc应用程序中,我使用EF5,并为每个http请求创建一个DbContext实例。我的代码不会担心打开/关闭数据库连接,因为它由EF本身处理。

我的问题:

  1. 如果我在一个http请求中使用DbSet进行多个数据库读/写操作。每个操作都需要打开/关闭数据库连接吗?在一个http请求中,可能会导致这么多打开/关闭,这很昂贵。

  2. 如果上述问题为是,我可以自己手动管理打开/关闭数据库连接,以便它将在begin_request中打开并在end_request处关闭吗?

  3. 由于

2 个答案:

答案 0 :(得分:1)

  1. 是的,但它由连接池处理,所以不要担心。保存更改通过单个打开的连接发生,适用于许多实体。
  2. 不,有可能但很难实现它是非常内部的,没有记录。您可以浏览源代码并尝试,但不值得,您将保持连接打开很长时间,连接池可能会受到影响。
  3. 我们有EF4的生产服务器,我们看不到在一天内偷看的近1000个同时发出的请求的性能问题。

答案 1 :(得分:0)

您可以使用以下DbContext的构造函数在Entity Framework 6上手动管理连接:

DbContext(DbConnection, Boolean)

有一个例子(伪代码):

// ...
var myConnection = new SqlConnection(myConnectionString);
var myDbContext = new MyDbContext(myConnection, false);
// ...
// TODO: you must close and dispose "myConnection" manually

MyDbContext的位置:

class MyDbContext : DbContext 
{
   // ....

   // constructor
   MyDbContext(DbConnection conn, boolean contextOwnsConnection)
     : base (conn, contextOwnsConnection) 
   {
      // ...
   }

   // ....

}

如果您使用" true"作为contextOwnsConnection,当我们的DbContext被释放时,连接将被关闭。

有关布尔参数的帮助,请参阅https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.113).aspx

上的文档

请注意,我们可以使用此方法使用具有相同连接的多个DbContexts。

另请注意,我们可以根据我们连接的数据库使用连接。在以下示例中,我们为实体框架安装了ODP以使用Oracle:

var myConnection = new OracleConnection(myConnectionString);