Как да прехвърлите съществуващ 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