C# 重用连接的实体框架

C# 重用连接的实体框架,c#,entity-framework,C#,Entity Framework,在用于连接到实体的使用块中 调用另一个方法时如何重用连接 因此,我: using (SampleEntities entities = new SampleEntities()) { entities.Connection.Open(); SomeMethod(); ... } void SomeMethod() { using (SampleEntities entities = new SampleEntities()) { // I w

在用于连接到实体的使用块中

调用另一个方法时如何重用连接

因此,我:

using (SampleEntities entities = new SampleEntities()) {
    entities.Connection.Open();
    SomeMethod();

    ...
}


void SomeMethod() {
   using (SampleEntities entities = new SampleEntities())
   {
      // I want to be able to use the existing connection before the method call, any ideas?
   }

}
为什么不呢

 void SomeMethod(SampleEnities context)

并把它传进来;让第一个使用排序处理。

如果您使用的是相同的连接字符串,则会为您处理连接池

即使您正在使用dispose,它也不会关闭连接。它将其返回到池中供下次使用

对于事务作用域,您希望使用相同的连接,因此必须在释放该连接之前完成事务中的所有操作

因此:

用法:

using(SampleEntities entities = new SampleEntities()){
  entites.Connection.Open();
  SomeMethod(entities);
  ...
}
您可以使用以下文档创建ConnectionScope和DataContextScope:

这意味着您可以执行以下操作:

using (var connection = container.Resolve<IDbConnection>())
using (var context = container.Resolve<IMyDataContext>())
{
    context.Connection = connection;

    // Do some stuff...

    context.SubmitChanges();
}
这就是我所做的,这是一种享受!这意味着context.SubmitChanges仅在堆栈顶部调用。因此,允许您调用使用连接/上下文的方法,而不用担心将它们作为参数传入。

DbContext构造函数的重载允许您确定是否应在上下文被释放时释放现有连接。您需要将DbConnection传递到上下文,并要求它保持连接的活动状态:

using(SqlConnection con = new SqlConnection(conStr))
{
  using(var context1 = new SampleEntities(existingConnection:con, contextOwnsConnection:false)
  {
  }

  using(var context2 = new SampleEntities(existingConnection:con, contextOwnsConnection:false)
  {
  }
}
更改上下文以将参数传递给基:

class SampleEntities : DbContext
{
    public SampleEntities(DbConnection existingConnection, bool contextOwnsConnection) :
                base(existingConnection, contextOwnsConnection) )
        {
        }
    }

我正在使用相同的连接字符串。如果我有一个事务作用域,我不想提升到MSDTC,因此,我希望能够重用现有连接。
using(SqlConnection con = new SqlConnection(conStr))
{
  using(var context1 = new SampleEntities(existingConnection:con, contextOwnsConnection:false)
  {
  }

  using(var context2 = new SampleEntities(existingConnection:con, contextOwnsConnection:false)
  {
  }
}
class SampleEntities : DbContext
{
    public SampleEntities(DbConnection existingConnection, bool contextOwnsConnection) :
                base(existingConnection, contextOwnsConnection) )
        {
        }
    }