Вопрос о Entity Framework и транзакциях - PullRequest
3 голосов
/ 24 октября 2010
        public void SomeMethod1()
        {
            using (TemplateEntities ctx = new TemplateEntities())
            {
                //do something in this ctx
            }
        }

        public void SomeMethod2()
        {
            using (TemplateEntities ctx = new TemplateEntities())
            {
                //do something else in this ctx
            }
        }

        public void SomeMethod()
        {
            using (TemplateEntities ctx = new TemplateEntities())
            {
                using (TransactionScope tran = new TransactionScope())
                {
                    SomeMethod1();
                    SomeMethod2();
                    var itemToDelete= (from x in ctx.Xxx
                                    where x.Id==1
                                    select x).Single();
                    ctx.Xxx.DeleteObject(itemToDelete);
                    ctx.SaveChanges();
                    tran.Complete(); 
                }
            }
        }

Что происходит в SomeMethod, выполняется в транзакции, даже если есть больше контекстов? Я использую POCO.

Ответы [ 2 ]

0 голосов
/ 24 октября 2010

В конечном счете, база данных не знает о контекстах данных, так что просто: применяются правила транзакций.Будучи сериализуемой транзакцией, такие вещи, как блокировки чтения и блокировки диапазона ключей, будут выполняться и выполняться.Как всегда, существует риск осложнений из-за тупиков, но в конечном итоге это должно сработать.Обратите внимание, что все задействованные контексты должны включаться по мере необходимости.

0 голосов
/ 24 октября 2010

Если вы используете TransactionScope с несколькими экземплярами ObjectContext, транзакция будет преобразована в распределенную, и вся операция (SomeMethod) будет обрабатываться как атомарная.Но распределенная транзакция требует дополнительной службы NT и ее зависимостей.Служба называется координатором распределенных транзакций Microsoft (MSDTC).Эта служба должна работать на всех задействованных серверах (сервер приложений и сервер базы данных).В сетевом сценарии служба требует некоторой дополнительной настройки.Для связи RPC порты должны быть открыты в брандмауэрах.

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