Mamy problemy z zaprojektowaniem naszej wielowątkowej aplikacji opartej na Entity Framework i chcielibyśmy uzyskać pewne wskazówki. Tworzymy jednostki na różnych wątkach, jednostki są dodawane do kolekcji, które są następnie danymi powiązanymi z różnymi kontrolkami wpf. Klasa ObjectContext nie jest bezpieczna dla wątków, więc zarządzając tym, mamy zasadniczo 2 rozwiązania:Entity Framework i Multi Threading
Rozwiązanie 1 ma jeden kontekst i ostrożnie korzysta z blokowania, aby zapewnić, że żaden wątek nie uzyska dostępu do niego w tym samym czasie. Byłoby to stosunkowo łatwe do wdrożenia, ale wymagałoby kontekstu, aby był aktywny przez cały czas trwania aplikacji. Czy jest to zły pomysł, aby otworzyć pojedynczą instancję kontekstu?
Rozwiązanie 2 polega na tworzeniu obiektów kontekstowych na żądanie, a następnie natychmiastowym odłączaniu obiektów, a następnie trzymaniu ich w naszych własnych kolekcjach, a następnie ponownym dołączaniu do nich w celu aktualizacji. Ma to jednak poważne problemy z używaniem, ponieważ gdy obiekty są odłączane, tracą odniesienia do obiektów właściwości nawigacji. Istnieje również problem, że 2 wątki nadal mogą próbować uzyskać dostęp do pojedynczego obiektu, a oba starają się dołączyć() do kontekstu. Musielibyśmy również podać nowy kontekst za każdym razem, gdy chcemy uzyskać dostęp do właściwości nawigacji jednostek.
P: Czy jedno z tych dwóch rozwiązań jest ważne, jeśli nie, w jaki sposób radzimy sobie z tym rozwiązaniem?
@us masz lepszy pomysł? – Cocowalla
@Cocowalla nie znając większego scenariusza, do którego adresuje OP, ja nie. Oba rozwiązania doprowadzą do bolesnej implementacji, dlatego ostrzegam go. Może on może wziąć zupełnie inną ścieżkę i użyć EF w sposób jednowątkowy (sposób, w jaki ma być używany). – usr
Inną rzeczą, na którą należy zwrócić uwagę: NIE MOŻNA wprowadzać żadnych zmian w obiekcie, gdy jest on odłączony, ponieważ obecnie żaden kontekst nie śledzi tej zmiany. Zmiana nie będzie trwała, gdy później zostanie wywołana funkcja SaveChanges(). – JoeCool