2011-11-21 4 views
5

Próbowałem kilka różnych sposobów, aby uzyskać prosty zestaw transakcji do pracy dla prostego klienta/serwera WCF. Mój serwer WCF ma deklarację klasy klasy Entity Framework dla mojego dostępu do bazy danych i kilka metod modyfikacji danych i metodę SaveChanges. Korzystam z Oracle Data Access (ODP.NET).Jak mogę uzyskać Entity Framework i WCF do pracy z transakcjami? Okay ... jaki jest sekret?

Na przykład chcę wywołać modyfikację z klienta, a następnie osobne wywołanie, aby zapisać zmiany w usłudze WCF. To nie działa. Zasadniczo wszystko wykonuje się poprawnie, ale po drugim wywołaniu, aby zapisać zmiany, usługa WCF nie ma już oryginalnego kontekstu, a zatem żadne zmiany nie są zapisywane (i, w konsekwencji, poprzednie wywołanie, które spowodowało, że zmiany zostały automatycznie wycofane) .

Używam zakres transakcji wokół obu operacji w moim kliencie i wykonanie Complete() po zakończeniu. Moje usługi WCF mają OperationContract, które używają [TransactionFlow(TransactionFlowOption.Mandatory)] i te implementacje metod używają [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]. Na koniec moja konfiguracja internetowa jest skonfigurowana za pomocą funkcji wsHttpBinding, która ma ustawioną właściwość transactionFlow na wartość True.

Nie mam szczęścia. Bez względu na to, co próbuję, kiedy próbuję trafić do serwisu w celu kontynuacji, kontekst EF jest już odnawiany.

+0

Nie wszystkie powiązania obsługują transakcje. http://www.wrox.com/WileyCDA/Section/Transactions-in-WCF-and-NET.id-305253.html – faester

+0

Jak radzisz sobie z sesją między połączeniami? Domyślnie WCF jest bezstanowi, więc jeśli nie kierujesz WCF, aby zrobić coś ze stanem, możesz tracić coś. –

+0

Czy jednostki wygenerowane przez edmx lub poco wygenerowały – Praneeth

Odpowiedz

4

Nie ma to nic wspólnego z transakcją. Transakcja działa na zasobie transakcyjnym, ale bez wywoływania SaveChanges w pierwszym żądaniu nie było aktywnego zasobu transakcyjnego, ponieważ kontekst EF nie jest częścią transakcji - baza danych jest, a baza danych ma wpływ tylko wtedy, gdy wywołujesz SaveChanges. Aby to zadziałało, nie potrzebujesz transakcji rozproszonych. Potrzebujesz usługi pełnej sesji i przechowujesz kontekst EF w instancji usługi. Klient używa tej samej instancji proxy klienta, aby komunikować się z usługą dla wszystkich żądań, komunikacja będzie obsługiwana przez tę samą instancję usługi = tę samą instancję kontekstu EF, która zapamięta zmiany z poprzednich wywołań.

IMHO to bardzo zła architektura. Po prostu go nie używaj. Wyeksponuj wyspecjalizowane metody na usługi WCF, które będą wprowadzać zmiany i zapisywać je. Jeśli chcesz wykonać te metody w transakcji z innymi zasobami transakcyjnymi, użyj prawdziwej transakcji rozproszonej.

+0

Szanuję twoją odpowiedź. I bałem się, że to będzie odpowiedź. Bummer. Niestety degraduje to korzystanie z mojej usługi. Na przykład, jeśli chcę zezwolić użytkownikom mojej usługi na tworzenie zamówień i/lub tworzenie/modyfikowanie nieistotnych elementów do tych zamówień (takich jak szczegóły produktu) i umożliwienie im powiązania się w pojedynczej transakcji, jeśli wykonają obie czynności, może ona nie należy wykonywać w sposób atomowy (wieloprzebiegowy). To jest do bani, ale rozumiem, co mówisz. Dzięki za odpowiedź. – Prethen

1

to może być powód. Ponieważ robisz aktualizację w innym kontekście. kontekst nie wie, że obiekt jest aktualizowany, aby powiedzieć kontekst, w którym obiekt jest modyfikowany, a następnie wywołuje savechnages(). Sprawdź, czy to pomaga

+0

Masz rację. Zasadniczo, to jest to, co zauważył poprzedni respondent. Szkoda, że ​​nie mogę tego zrobić bez nadania kontekstowi i usłudze statusu. – Prethen

Powiązane problemy