2013-08-28 7 views
5

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?

+2

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

+0

@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

+0

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

Odpowiedz

0

SELECT powinien mieć również taką samą klauzulę WHERE jak UPDATE.

UPDATE Table SET Column = @Column1, Column2 = @Column2 .... 
WHERE PK = @PK AND Timestamp = @Timestamp 

SELECT PK, Column1, Column2, ....., Timestamp 
WHERE PK = @PK AND Timestamp = @Timestamp 
0

Jeśli naprawdę nie chcesz zmienić zapisany kod procedury, można porównać datownik powrocie z procedury przechowywanej do znacznika czasu przeszedł do niego. Jeśli jest inny, to masz błąd współbieżności.

Powiązane problemy