W strukturze podmiotu, używając procedur przechowywanych, chciałbym wykonać aktualizację na mojej tabeli przy użyciu optymistycznej współbieżności. Nie udało mi się uzyskać tego działa, bez modyfikowania mojej istniejącej procedury przechowywanej aktualizacji. Próbuję ustalić, czy istnieje sposób, w jaki można mapować istniejącej procedury przechowywanej, tak aby wystąpił wyjątek współbieżności, gdy nie są aktualizowane żadne wiersze.Optymistyczna współbieżność przy użyciu procedur składowanych w podmiocie Entry Framework
Niektóre informacje tła:
- Mam odwzorowane procedurę aktualizacji przechowywane (w tym datownik) kolumny w moim .edmx pliku
Moja istniejące procedury przechowywane wygląda następująco (rzeczywistych nazw tabel a kolumny są oczywiście pominąć):
UPDATE Table SET Column = @Column1, Column2 = @Column2 .... WHERE PK = @PK AND Timestamp = @Timestamp SELECT PK, Column1, Column2, ....., Timestamp FROM Table WHERE PK = @PK
W przypadku, że aktualizacja nie powiedzie się (na skutek niedopasowania timestamp) select część procedury przechowywanej będzie nadal zwraca wiersz.
Kiedy zmodyfikować procedurę przechowywaną na następujące kwestie:
UPDATE Table SET Column = @Column1, Column2 = @Column2 ....
WHERE PK = @PK AND Timestamp = @Timestamp
IF @@ROWCOUNT > 0
SELECT PK, Column1, Column2, ....., Timestamp
FROM Table WHERE PK = @PK
Potem wszystko działa zgodnie z oczekiwaniami, a błąd występuje współbieżności.
Alternatywnie, jeśli sprawię, że procedura składowana zwróci parametr wyjściowy i zamapuje ten parametr wyjściowy na "Parametr związany z wierszami" w pliku .edmx obiektu Entity Framework, wówczas błąd współbieżności działa również zgodnie z oczekiwaniami.
To rozwiązanie (czyli przy użyciu parametru wyjściowego) wyjaśnione jest najlepszy, znalazłem tutaj: http://petermannerhult.wordpress.com/2010/10/01/entity-framework-4-with-optimistic-concurrency-and-stored-procedures/
Żaden z powyższych etapów wyglądać powinny one być jednak konieczne, gdyż zakładam, że Entity Framework mógł wystarczy użyć zaktualizowanej liczby wierszy, aby określić, czy powinien on wywoływać wyjątek współbieżności. Użyłem tych dokładnie tych samych procedur przechowywanych (z optymistyczną współbieżnością) w ADO.NET DataSets, bez żadnego problemu. Moje pytanie brzmi: jak mogę używać istniejących procedur przechowywanych, bez modyfikacji, w celu umożliwienia optymistycznej współbieżności w Entity Framework?
Nie sądzę, że jest to problem z EF. EF nie ma dostępu do liczby wierszy instrukcji aktualizacji w przechowywanym proc. Tak więc musisz sam sobie z tym poradzić, sprawdzając wartość rowcount w swoim proc lub zwracając liczbę wierszy z proc, aby EF mogło dowiedzieć się, czy wiersz został zaktualizowany. – Satish
@Satish Dzięki za odpowiedź, ale czy możesz wyjaśnić, dlaczego EF nie ma dostępu do liczby wierszy mojego wyciągu aktualizacji? Ta informacja powinna być dostępna podczas wykonywania procedury składowanej w SQL Server. Na przykład można uzyskać do niego dostęp za pomocą właściwości RecordsAffected obiektu SqlDataReader (patrz http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.recordsaffected.aspx). Biorąc pod uwagę, że ta dokładna procedura przechowywana działa w ADO.NET (z optymistyczną współbieżnością), musi być możliwe określenie liczby zaktualizowanych wierszy. Czy istnieje powód, dla którego EF nie może tego zrobić? – actf
Kiedy masz zapisany proc, wywołujący proc nie zna rzędów każdego z instrukcji w twoim proc. Gdybyśmy wywołali ten sam proces za pomocą ADO.NET, myślę, że zachowałoby się tak samo, jak EF. – Satish