2013-03-27 8 views
5

Podczas tworzenia nowego lub aktualizacji istniejących dokumentów w RavenDB dokumentacja mówi to zrobić wzdłuż tych linii:Każda wada wywoływania _documentSession.Store podczas aktualizowania istniejących dokumentów w RavenDB?

public string Save(Blogpost post) 
{ 
    Blogpost model; 

    if (String.IsNullOrEmpty(post.Id)) 
    { 
     model = new Blogpost(); 
     _documentSession.Store(model); 
    } 
    else 
    { 
     model = _documentSession.Load<Blogpost>(post.SimpleId); 
    } 

    model.Text = template.Text; 
    model.Name = template.Name; 
    _documentSession.SaveChanges(); 

    return model.Id; 
} 

Ktoś w moim zespole robi oszczędza inny sposób dla obu tworzenia nowych dokumentów lub aktualizacji istniejących:

public string Save(Blogpost post) 
{ 
    _documentSession.Store(post); 
    _documentSession.SaveChanges(); 
    return post.Id; 
} 

Czy jest jakaś wada polegająca na tym, że zawsze dzwonisz pod numer .Store(), nawet jeśli dokument już istnieje?

Odpowiedz

1

Sklep zapisze ten obiekt w nowym dokumencie. Użyj funkcji śledzenia zmian wbudowanej w obiekcie sesji, podobnie jak wzorzec Jednostka pracy, jak sugerują dokumenty.

+0

Zgadzam się z tym. Ktoś inny wpadł na ten pomysł i wolałbym nie arbitralnie go zbijać, nie rozumiejąc dlaczego. Zaletą jest to, że czyni kod znacznie czystszym w niektórych obszarach. –

+0

synhershko jest jakiś powód, aby to zrobić, że brakuje mi? W moich testach drukarskich nie wydawało mi się nic robić z surowym ruchem ... –

+0

@JohnCulviner zobacz moje komentarze do twojego posta. To okazuje się być dyskusją, która powinna być naprawdę wykonana na liście mailingowej, a nie na SO. – synhershko

4

Jason, Twój kod będzie zawsze nadpisać dokument. Czy to jest coś, co chcesz robić?

+2

W około 1/2 przypadków użycia, całkowite pominięcie jest w porządku. Zakwestionowałem to podejście, które wpadł, ponieważ jestem przyzwyczajony do Entity Framework i typowy Unit of Work. Chciałem tylko upewnić się, że nie ma podstawowych problemów, które to podejście spowoduje w naszym wniosku. –

+1

Nie tak oczywistym skutkiem ubocznym nadpisania jest utrata niestandardowych wartości metadanych. –

+1

Tak, jeśli chcesz zachować metadane, załaduj dokument, zaktualizuj go, a następnie zadzwoń SaveChanges() –

5

Jeśli robisz bogaty aplikację kliencką i szeregowania pełną blogpost do klienta tak:

//GET BlogPost/1 
public BlogPost Get(int id) 
{ 
    return _documentSession.Load<BlogPost>(id) 
} 

Następnie rehyrdating pełną blogpost na serwerze, gdy użytkownik dokonał zmiany. Poniższy kod wydaje się być bardziej skuteczne niż robi Załaduj a następnie sklep:

//POST BlogPost/ 
public void Post(BlogPost post) 
{ 
    //blog post already has an Id in this example 
    _documentSession.Store(post) 
    _documentSession.SaveChanges(); 
} 

kiedy wykonujesz

documentSession.Load<Blogpost>(id) 

RavenDB zwraca pełny JSON na blogu, że już mieć tylko po to, żeby go zastąpić, obróć się i ponownie zapisz, wysyłając pełny JSON do bloga z powrotem do Wire'a do Raven.

Oznacza to, że wykonanie operacji Załaduj i zapisz, gdy już posiadasz wszystkie dane, powoduje dwukrotne zwiększenie ruchu w sieci do Raven, bez dodatkowych korzyści, które widzę przy użyciu Fiddlera.

Nawet jeśli były tylko zmieniając część obiektu (słownie nazwa blogpost) API RavenDB NET nadal wysyła cały obiekt na drucie, gdy robi:

  • load()
  • zrobić kilka zmian (ale nie wszystko) zmiany do
  • Store()
  • SaveChanges()

Być może Ayende Rahien może oświecić nas na czymkolwiek, co tu przegapiłem?

+1

Brakuje 3 rzeczy: 1) API klienta RavenDB używa buforowania, więc jeśli już załadowałeś go Pobierz ponownie go w Post wygeneruje minimalny ruch, a nie pełny dokument JSON. Jeśli masz pełny dokument JSON, to dobrze, że załadowałeś go ponownie, ponieważ były inne zmiany podczas pracy nad nim. 2) W kontynuacji # 1, pozwala ci to wykorzystać Optymistyczną Współbieżność, a 3) UoW to właściwy sposób robienia tego rodzaju rzeczy, głównie z powodów, o których wspomniałem. – synhershko

+0

Awesome, to była odpowiedź, której szukaliśmy. Nie wiem, czy widziałem # 1, który wystąpił w sieci, ale mogło to być spowodowane debugowaniem. Myślę, że Optymistyczna Współbieżność to dobry punkt. Przypuszczam, że można użyć Automappera, aby wypchnąć BlogPost od klienta do Load'ed , czy to ma znaczenie? Dobry towar! Być może ja/ty możesz pracować nad aktualizowaniem stron dokumentacji również. –

Powiązane problemy