The wrong approach is to try to store disconnected objects. db4o manages object by their object-identity and doesn't recognize objects which have been serialized or loaded by another object container instance. This example shows, that instead of updating the object, db4o will store a new instance of the object.
Pilot joe;
using (IObjectContainer container = OpenDatabase())
{
joe = QueryByName(container, "Joe");
}
// The update on another object
joe.Name = "Joe New";
using (IObjectContainer otherContainer = OpenDatabase())
{
otherContainer.Store(joe);
}
using (IObjectContainer container = OpenDatabase())
{
// instead of updating the existing pilot,
// a new instance was stored.
IList<Pilot> pilots = container.Query<Pilot>();
Console.WriteLine("Amount of pilots: " + pilots.Count);
foreach (Pilot pilot in pilots)
{
Console.WriteLine(pilot);
}
}
Dim joe As Pilot
Using container As IObjectContainer = OpenDatabase()
joe = QueryByName(container, "Joe")
End Using
' The update on another object
joe.Name = "Joe New"
Using otherContainer As IObjectContainer = OpenDatabase()
otherContainer.Store(joe)
End Using
Using container As IObjectContainer = OpenDatabase()
' instead of updating the existing pilot,
' a new instance was stored.
Dim pilots As IList(Of Pilot) = container.Query(Of Pilot)()
Console.WriteLine("Amount of pilots: " & pilots.Count)
For Each pilot As Pilot In pilots
Console.WriteLine(pilot)
Next
End Using
So in order to update an object, you need to load and store it in the same object-container. If you cannot do this, you need to merge to object-changes. See "Example Merge Changes"
using (IObjectContainer container = OpenDatabase())
{
Pilot joe = QueryByName(container, "Joe");
joe.Name = "Joe New";
container.Store(joe);
}
using (IObjectContainer container = OpenDatabase())
{
IList<Pilot> pilots = container.Query<Pilot>();
Console.WriteLine("Amount of pilots: " + pilots.Count);
foreach (Pilot pilot in pilots)
{
Console.WriteLine(pilot);
}
}
Using container As IObjectContainer = OpenDatabase()
Dim joe As Pilot = QueryByName(container, "Joe")
joe.Name = "Joe New"
container.Store(joe)
End Using
Using container As IObjectContainer = OpenDatabase()
Dim pilots As IList(Of Pilot) = container.Query(Of Pilot)()
Console.WriteLine("Amount of pilots: " & pilots.Count)
For Each pilot As Pilot In pilots
Console.WriteLine(pilot)
Next
End Using