Как передать существующий SqlConnection нескольким ObjectContexts

Я передаю SqlConnection функции. В каждой функции создается несколько контекстов объекта. Я хотел бы каким-то образом использовать один SqlConnection, который я передал для всех контекстов объекта, чтобы я мог использовать его в рамках одной области транзакции, не включая службу распределенных транзакций.

Это пример кода:

public bool InsertObjects<T>(TransactionScope transaction, SqlConnection sqlConnection, IEnumerable<T> objectsToInsert)
{
using (EntityConnection conn = GetEntityConnection())
    {
        Type objectContextType;
        ObjectContext objectContext = (ObjectContext) Activator.CreateInstance(objectContextType, new object[] {conn});

        //Some code using the objectContext

    }
}

person Sailoosha    schedule 24.08.2011    source источник
comment
Я бы не стал передавать SqlConnection - это похоже на то, что вы где-то его создали, а затем передаете / используете везде. Я бы не стал этого делать - я бы предпочел передать строку подключения, а затем создавать новое подключение каждый раз, когда оно мне понадобится.   -  person marc_s    schedule 24.08.2011


Ответы (2)


Это не похоже на хороший подход. Зачем ты это делаешь? Для этого вам необходимо:

  • Использовать одну и ту же строку подключения для всех контекстов = одна и та же база данных
  • Используйте одни и те же метаданные (сопоставление) для всех контекстов или передайте отдельный набор метаданных для каждого контекста.
  • Соединение должно быть закрыто до тех пор, пока не будут созданы все контексты, если какой-либо контекст или операция открывает соединение, следующее создание контекста не удастся.

Поэтому, если вы не используете какую-то сложную базу данных, в которой отображение было разделено на несколько EDMX, вся эта концепция неверна. Одна операция в одной базе данных = одна единица работы = один контекст = одно соединение. В вашем случае похоже, что вы хотите сделать это с одним типом объекта - ПОЧЕМУ?

Более того, передача собственной коллекции контекстам объектов не позволит контекстам оптимально обрабатывать соединение (освобождая их, когда они им не нужны).

person Ladislav Mrnka    schedule 24.08.2011

Лучшим решением будет пул подключений.
Создайте объект подключения в объекте, подключитесь с включенными параметрами пула.
При следующем подключении он проверит, активно ли подключение, и будет использовать его.
Если подключения нет, он установит один.

Вот руководство по использованию пулов подключений

person Threekill    schedule 25.08.2011