Entity Framework Повторное использование соединения - PullRequest
2 голосов
/ 09 апреля 2010

в блоке использования для соединения с сущностями,

Как мне повторно использовать соединение при вызове другого метода?

так что у меня есть:

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?
   }

}

Ответы [ 5 ]

3 голосов
/ 09 апреля 2010

почему бы не иметь

 void SomeMethod(SampleEnities context)

и передать его; позвольте первому "использующему" разобраться в утилизации.

Доброжелательность,

Dan

2 голосов
/ 09 апреля 2010

Вы можете создать ConnectionScope и DataContextScope, используя документы здесь: http://msdn.microsoft.com/en-us/magazine/cc300805.aspx

Это означает, что вы можете сделать это:

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

    // Do some stuff...

    context.SubmitChanges();
}

Это то, что я сделал, и это работает удовольствие ! Это означает, что context.SubmitChanges() вызывается только в верхней части стека. Поэтому вы можете вызывать методы, которые используют соединение / контекст, не беспокоясь о том, чтобы передавать их как параметры.

0 голосов
/ 13 июня 2015

Перегрузка конструктора 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) )
        {
        }
    }
0 голосов
/ 09 апреля 2010
void SomeMethod(SampleEntities entities){

  var do_dispose = false;

  try{

  if(entities == null) { entities = new SampleEntities();
  entities.Connection.Open(); 
  do_dispose = true; }


    // do with entity object...
  }
  finally{
    if(do_dispose && entities != null){
      entities.Dispose();
    }
  }

}

использование:

using(SampleEntities entities = new SampleEntities()){
  entites.Connection.Open();
  SomeMethod(entities);
  ...
}
0 голосов
/ 09 апреля 2010

При условии, что вы используете одну и ту же строку подключения, пул подключений обрабатывается для вас.

Даже если вы используете утилиту dispose, соединение не закрывается. Он возвращает его в пул для следующего использования.

Для области транзакции вы хотите использовать одно и то же соединение, поэтому вы должны сделать все в транзакции до того, как это соединение будет удалено.

так:

using(...){
  call methods execute transaction...

 You can pass the connection into other methods here for use, 
 just make sure it doesn't get disposed in that method.

 commit..
}//connection is disposed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...