This example shows how changes are merged from the disconnected object to the object to update. To do this, traverse the object-graph and copy all value types over. All reference-types are first checked if they're an existing object. If it is,the primitives are copied over, otherwise it's a stored as a new object.
using (IObjectContainer container = OpenDatabase()) { // first get the object from the database Car carInDb = GetCarById(container, disconnectedCar.ObjectId); // copy the value-objects (int, long, double, string etc) carInDb.Name = disconnectedCar.Name; // traverse into the references Pilot pilotInDB = carInDb.Pilot; Pilot disconnectedPilot = disconnectedCar.Pilot; // check if the object is still the same if (pilotInDB.ObjectId.Equals(disconnectedPilot.ObjectId)) { // if it is, copy the value-objects pilotInDB.Name = disconnectedPilot.Name; pilotInDB.Points = disconnectedPilot.Points; } else { // otherwise replace the object carInDb.Pilot = disconnectedPilot; } // finally store the changes container.Store(pilotInDB); container.Store(carInDb);
Using container As IObjectContainer = OpenDatabase() ' first get the object from the database Dim carInDb As Car = GetCarById(container, disconnectedCar.ObjectId) ' copy the value-objects (int, long, double, string etc) carInDb.Name = disconnectedCar.Name ' traverse into the references Dim pilotInDB As Pilot = carInDb.Pilot Dim disconnectedPilot As Pilot = disconnectedCar.Pilot ' check if the object is still the same If pilotInDB.ObjectId.Equals(disconnectedPilot.ObjectId) Then ' if it is, copy the value-objects pilotInDB.Name = disconnectedPilot.Name pilotInDB.Points = disconnectedPilot.Points Else ' otherwise replace the object carInDb.Pilot = disconnectedPilot End If ' finally store the changes container.Store(pilotInDB)
You can use reflection to automated this process. You can also use existing libraries like Automapper which help you to do this.