2013-02-28 7 views
9

Nie wiem, czy to jest zamierzone, czy błąd, ale poniższy kod wykorzystujący BeforeSaveEntity będzie modyfikował encję tylko dla nowo utworzonych rekordów (EntityState = Added) i nie będzie działać do modyfikacji, czy to prawda?Breeze BeforeSaveEntityonly zezwala tylko na aktualizację Dodanych jednostek

protected override bool BeforeSaveEntity(EntityInfo entityInfo) 
    { 
     var entity = entityInfo.Entity; 
     if (entity is User) 
     { 
      var user = entity as User; 
      user.ModifiedDate = DateTime.Now; 
      user.ModifiedBy = 1; 
     } 
... 

Odpowiedz

9

Źródłem tego problemu jest to, że na serwerze breeze nie mamy żadnego wbudowanego mechanizmu śledzenia zmian dla zmian wprowadzonych na serwerze. Elementy serwera mogą być czystymi poco. Klient bryzy ma bogatą możliwość śledzenia zmian dla wszelkich zmian po stronie klienta, ale kiedy dojdziesz do serwera, musisz sam nim zarządzać.

Problem występuje z powodu optymalizacji, którą wykonujemy na serwerze, dzięki czemu aktualizujemy tylko te zmienione właściwości. to znaczy, że wszelkie instrukcje aktualizacji SQL są wprowadzane tylko w zmienionych kolumnach. Oczywiście nie stanowi to problemu dla Adds and Deletes ani tych przypadków, w których aktualizujemy kolumnę, która została już zaktualizowana na kliencie. Ale jeśli zaktualizujesz pole na serwerze, które nie zostało zaktualizowane na kliencie, bryza nic o nim nie wie.

Teoretycznie moglibyśmy zrobić migawkę każdej jednostki wchodzącej na serwer, a następnie iterować po każdym polu jednostki, aby stwierdzić, czy w trakcie przechwytywania zapisano jakieś zmiany, ale naprawdę nie znosimy implikacji związanych z perfekcją, zwłaszcza że ten przypadek rzadko się zdarza.

Zatem sugestia podana w innej odpowiedzi tutaj, aby zaktualizować stronę OriginalValuesMap po stronie serwera, jest poprawna i zrobi dokładnie to, czego potrzebujesz.

Dodatkowo, od wersji 1.1.3 istnieje dodatkowa flaga EntityInfo.ForceUpdate, którą można ustawić, która powie poleceniu aktualizacji każdej kolumny w podanej jednostce. To nie jest tak skuteczne jak powyższa sugestia, ale jest prostsze, a efekty będą takie same w obu przypadkach.

Mam nadzieję, że to pomoże.

7

miałem ten sam problem, i że w ten sposób rozwiązany:

protected override bool BeforeSaveEntity(EntityInfo entityInfo) 
{ 
    if(entityInfo.EntityState== EntityState.Modified) 
    { 
    var entity = entityInfo.Entity; 
    entityInfo.OriginalValuesMap.Add("ModificationDate", entity.ModificationDate); 
    entity.ModificationDate = DateTime.Now; 
    } 
} 

myślę, że można to łatwo zastosować do sprawy.

+0

Yikes. Zajmujemy się tym i robimy bardziej intuicyjną rzecz. Gotowość do wiadomości. – Ward

+1

Dzięki temu, że zadziałało, zmieniono odpowiedź, aby zadeklarować jednostkę jako dynamiczną. –

+0

Tak, dzięki za obejście problemu. Ale OMG to okropne. Szukam lepszej odpowiedzi w niezbyt odległej wersji. Dzięki za znalezienie tego ... i przetrwanie tego. – Ward

Powiązane problemy