Entities Aktualisieren – Entity Framework 5 vs. Linq-to-SQL vs. NHibernate

Praktisch jeder ORM dürfte eine Funktion anbieten, mit der man eine geladene Entity mit den Daten aus der Datenbank aktualisiert.

So funktioniert’s in drei verbreiteten .NET ORMs:

Entity Framework 5

 myEntities.Entry(myObj).Reload();
 myEntities.Entry(myObj).Collection(o => o.SomeCollection).Load();

Der Aufruf von Reload ist recht selbsterklärend. Für jede Collection muss ebenso ein Aufruf abgesetzt werden. Out-of-the-box lässt sich also nicht das gesamte Object aktualisieren. Allerdings lässt sich dafür leicht ein Helper bauen.

Linq-to-SQL

Linq-to-SQL bietet leider nur sehr eingeschränkte Möglichkeiten beim Refresh. Das Reload des eigentlichen Objektes funktioniert analog zu EF. Jedoch können Collections nur über einen Workaround aktualisiert werden.

 myContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, myObj);

 // Workaround for Collections 
 myObj.SomeCollection.Clear();
 myObj.SomeCollection.AddRange(myContext.SomeCollectionTable.Where(c => c.MyObjectId == myObj.MyObjectId));

Der Workaround ist offiziell von Microsoft so beschrieben.

NHibernate

Am einfachsten hat man es bei NHibernate:

mySession.Refresh(myObj);

Ein Aufruf und alle Collections werden automatisch aktualisiert.

Fazit

Mit NHibernate lässt sich das natürlich am einfachsten bewerkstelligen, aber auch mit Entity Framework 5 ist dies leicht möglich. Lediglich Linq-to-SQL ist der Aufgabe nicht wirklich gewachsen und erfordert viel Implementierungsarbeit.

Download vollständige Beispiele und die Beispiel-DB.