2013-03-27 6 views
5

Wenn neue erstellen oder vorhandene Dokumente in RavenDB aktualisieren, sagt die Dokumentation es in diese Richtung zu tun:Haben Sie Nachteile beim Aufrufen von _documentSession.Store beim Aktualisieren vorhandener Dokumente in 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; 
} 

Jemand in meinem Team ist sowohl für die Erstellung neue Dokumente oder die Aktualisierung bestehender spart eine andere Art und Weise zu tun:

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

Gibt es einen Nachteil, immer .Store() aufzurufen, selbst wenn das Dokument bereits existiert?

Antwort

1

Store speichert dieses Objekt in einem neuen Dokument. Verwenden Sie die Änderungsverfolgungsfunktion, die in das Sitzungsobjekt integriert ist, wie das Dokument "Arbeitseinheit", wie die Dokumente vorschlagen.

+0

Dem stimme ich zu. Jemand anderes kam auf diese Idee, und ich würde es lieber nicht willkürlich abschießen, ohne zu verstehen warum. Der Vorteil ist, dass der Code in einigen Bereichen deutlich sauberer wird. –

+0

Synhershko gibt es eine Art Grund, dies zu tun, dass ich vermisse? In meinen over the wire Tests schien es nichts zu tun mit dem rohen Verkehr ... –

+0

@JohnCulviner siehe meine Kommentare zu deinem Beitrag. Dies wird zu einer Diskussion, die wirklich auf der Mailing-Liste und nicht auf SO gemacht werden sollte. – synhershko

4

Jason, Ihr Code wird immer überschreiben das Dokument. Möchten Sie etwas tun?

+2

In etwa der Hälfte der Anwendungsfälle ist das vollständige Überschreiben in Ordnung. Ich habe diesen Ansatz in Frage gestellt, da ich an Entity Framework gewöhnt bin und typisch für die Arbeitseinheit bin. Ich wollte nur sicherstellen, dass es keine grundlegenden Probleme gibt, die dieser Ansatz in unserer Anwendung verursacht. –

+1

Eine nicht so offensichtliche Nebenwirkung des Überschreibens besteht darin, dass benutzerdefinierte Metadatenwerte verloren gehen. –

+1

Ja, wenn Sie Metadaten beibehalten möchten, laden Sie das Dokument, aktualisieren Sie es und rufen Sie SaveChanges() –

5

Wenn Sie eine Rich-Client-App tun und Serialisierung die volle Blogpost an den Client wie folgt:

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

Dann rehyrdating eine vollständige Blogpost auf dem Server, nachdem ein Benutzer Änderungen vorgenommen hat. Der Code unten erscheint, effizienter zu sein als eine Last zu tun und dann einen Store:

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

Wenn Sie das tun ein

documentSession.Load<Blogpost>(id) 

RavenDB die volle JSON für den Blog-Post zurückgibt, die Sie bereits Nur für Sie, um es zu überschreiben, drehen Sie um und speichern Sie den gesamten JSON für den Blog-Post wieder über den Draht zu Raven.

Das bedeutet, dass das Laden und Speichern, wenn Sie bereits alle Daten haben, den doppelten Netzwerkverkehr für Raven ergibt, ohne zusätzlichen Nutzen, den ich mit Fiddler sehen kann.

Auch wenn Sie änderten sich nur ein Teil des Objekts (zum Beispiel der Name des Blogpost) die RavenDB .NET-API sendet immer noch das gesamte Objekt über den Draht, wenn eine tun:

  • Load()
  • machen einige Änderungen (aber keine Änderungen an alles)
  • Store()
  • Savechanges()

Vielleicht kann uns Ayende Rahien über alles, was ich hier vermisse, aufklären?

+1

Sie fehlen 3 Dinge: 1) Die RavenDB-Client-API verwendet Caching, also wenn Sie es bereits geladen in laden wieder in Post generiert nur minimalen Traffic, nicht das komplette JSON-Dokument. Wenn Sie das vollständige JSON-Dokument erhalten, ist es gut, dass Sie es erneut geladen haben, da während der Bearbeitung andere Änderungen vorgenommen wurden. 2) In Fortsetzung zu # 1, ermöglicht es Ihnen, Vorteile der optimistischen Parallelität zu nutzen, und 3) UoW ist die richtige Art, diese Art von Dingen zu tun, meist aus den Gründen, die ich gerade erwähnt habe. – synhershko

+0

Großartig, das war die Antwort, nach der wir gesucht haben. Ich weiß nicht, ob ich # 1 über den Wire-Verkehr aufgetreten bin, aber es könnte wegen Debugging sein. Ich denke, die Optimistische Nebenläufigkeit ist ein guter Punkt. Ich nehme an, man könnte mit Automapper den BlogPost vom Client in den Load'ed schieben oder spielt das eine Rolle? Gutes Zeug! Vielleicht könnte ich auch daran arbeiten, die Dokumentationsseiten zu aktualisieren. –

Verwandte Themen