/ / Подкрепя ли рамката на ADO Entity Non DTCсделки? Няколко заявки в рамките на един EntityContext и един TransactionScope причиняват насърчаване на DTC - c #, рамка на предприятието, транзакции, transactionscope, msdtc

Подкрепя ли рамката на ADO Entity Non DTCсделки? Няколко заявки в рамките на един EntityContext и един TransactionScope причиняват насърчаване на DTC - c #, рамка на предприятието, транзакции, transactionscope, msdtc

Имам уеб приложение, което използва Entity Framework - използваме класа TransactionScope за осигуряване на околни транзакции.

Има ли някакъв начин да кажете на EF да използва стандартТ-SQL транзакция вместо транзакция с DTC? Доста често се правят редица заявки към различни таблици в рамките на един EntityContext и един TransactionScope инстанция, но това винаги изглежда, че насърчава транзакцията към DTC

Направих кратък пример заедно, вижте по-долу. Заявката към индивидуалната таблица правилно стартира T-SQL транзакция и е свързана със SPID 54 След това се извършва заявката в таблицата с ContactUs и EF го прави на различна връзка (SPID 53), която има влияние върху насърчаването на транзакцията за транзакция с DTC. **

using (MyEntities DB = new MyEntities())
{
using (TransactionScope t = new TransactionScope())
{
DB.Individual.First().EmailAddress = "bob" + DateTime.Now.Second.ToString() + "@bob.com"; // done on connection 54
DB.ContactUs.First(); // done on connection 53 thus promoting the transaction!!
DB.SaveChanges();
t.Complete();
}
}

Отговори:

7 за отговор № 1
  1. Комплект Привлече = фалшива върху връзката низ, за ​​да избегнете автоматично зареждане на транзакция.

  2. Ръчно привличане на връзка като участници в обхвата на транзакцията. (Http://msdn.microsoft.com/en-us/library/ms172153%28v=VS.80%29.aspx)


4 за отговор № 2

Не сте споменавали, но звучи като че използвате SQL Server 2005. При SQL Server 2005, ако има повече от една връзка в TransactionScope, транзакцията ще бъде ескалира от лека транзакция до разпределена транзакция, Няма значение дали е същата база данни и един и същ ConnectionString - все още се популяризира.

Това не е "проблем" с Entity Framework катотъй като това е съществуващо поведение с System.Transactions. Въпросът съществува и с обикновения ADO.NET. В миналото използвах "Библиотека на предприятията", която под корицата поддържа списък с връзки, които участват в транзакциите и ако се опитате да изтеглите нова връзка по време на транзакция, тя ще ви върне връзката, която вече е отворена и участва във вашата транзакция.

Ако използвате SQL Server 2008, поведението се подобрява, така че транзакциите не се популяризират при отваряне на няколко връзки към същата база данни.


1 за отговор № 3

Не е рамката на Entity, която причинява използването на разпределени транзакции; скоро, това е TransactionScope, EF ще използва "нормална" транзакция, за да приключи всички SQL изрази, изпълнени в контекста на еднократно обаждане SaveChanges(), В примера, който давате, имате само един разговор SaveChanges, Ето защо не би трябвало да използвате TransactionScope изобщо нека промените ви се прилагат атомно.

Не знам как да направя TransactionScope използвайте неразпределени транзакции, но аз съм убеден, че това не е рамката на Entity.


0 за отговор № 4

Наблюдавах проблеми с ескалацията на DTC, използвайки EntityРамка с членската система ASP.NET, тъй като двете използват различни низове за връзка. Настройката "Enlist = false" в низовете за връзка на системата за членство реши проблема за мен.