db4o Developer Community

db4o open source object database, native to Java and .NET
Welcome to db4o Developer Community Sign in | Join
in Search
More Search Options

Unable to ‘Retrieve Objects’ using GetByUUID method

Last post 06-20-2007, 09:33 AM by JSealey. 8 replies.
Sort Posts: Previous Next
  •  06-07-2007, 09:55 AM 37292

    Unable to ‘Retrieve Objects’ using GetByUUID method

    Upon using the GenerateUUIDs method to turn on UUID generation for specific classes in the database, I saved the target objects using IObjectContainer#set and #commit methods. Next, I retrieved the Db4oUUIDs from the database using #Ext().GetObjectInfo(..).GetUUID method and assigned them to a List<Db4oUUID> collection.

    Before closing the IObjectContainer, I retrieved the objects using the #Ext().GetByUUID method and the objects returned were as expected. But, when I subsequently closed the IObjectContainer and reopened it to retrieve the objects from the previously assigned List<Db4oUUID> collection the object was empty! I expected Db4o to maintain an inverted indexed list of UUIDs and slot references of the location in the database for fast retrieval.

    For me this is a show-stopper! I was intending on using this technique to setup relational links between objects containing hard data separate from linked data. Please, I would very much appreciate help on this problem.

    Regards, John Sealey
    Fountain Valley CA
    jojuse@prodigy.net

    _____________________________________________________________________________________________

    The code and output snippets are as follows:

    Notes:
    1.
    DbListCar and DbListDriver (not listed) routines are very similar in functionality.
    2.
    UpdateDepth(2) was set for ListCar, Car, ListDriver & Driver object classes.
    3.
    UniqueEnabled = false – Rejects update on Unique Field Constraints – unresolved Db4o problem!.
    4.
    CascadeOnUpdate(true) was set for Car & Driver object classes
    5.
    GenerateUUIDs(true) was set for Car & Driver object classes.

    // Add a new 'CarDriver' relation in database.
    private void AddDbCarDriverRelation(string[] record, IObjectContainer db)
    {
      // Add new 'Car' type in database.
      Car dbCar = AddDbCar(record, db);

      // Add new 'Driver' type in database.
      Driver dbDriver = AddDbDriver(record, db);

      ListCar dbListCar = AddDbType<ListCar>(new ListCar("DbCars"), db);
      DisplayTime("DbCars", dbListCar.Name);

      MatchCarModel = dbCar.Model;                   // Set 'Car.Model' match item.
      if (!(dbListCar.Cars.FindIndex(CarMatch) < 0))
      {
        // Position in 'Cars' list.
        int ndxCar = dbListCar.Cars.FindIndex(CarMatch);

        Db4oUUID driverUUID = db.Ext().GetObjectInfo(dbDriver).GetUUID();
        if (TimeTrackEnabled)
          Console.WriteLine("DriverUUID=" + driverUUID.GetLongPart());

        // Test if 'Driver' exists otherwise add new item to 'Cars.Drivers'.
        MatchDriverUUID = driverUUID;               // Set 'DriverUUID' match item.
        if (dbListCar.Cars[ndxCar].DriverUUIDs.FindIndex(DriverUUIDMatch) < 0)
        {
          // Update database list.
          dbListCar.Cars[ndxCar].DriverUUIDs.Add(driverUUID);
          UpdateDbType<ListCar>(dbListCar, db);

          if (TimeTrackEnabled)
            Console.WriteLine("++Car=" + dbCar.Model + " Driver=" + dbDriver.Name);

          DisplayTime("CarDriver", dbDriver.Name); // New 'CarDriver' relation.
        }
        else
        {
          // Already exists.
          TimeDuration = -1;
          DisplayTime("CarDriver", dbDriver.Name); // Old 'CarDriver' relation.
        }

        if (TimeTrackEnabled) DisplayDbCars(db);
      }
    }

    // Add a new 'Car' type to database.
    private Car AddDbCar(string[] record, IObjectContainer db)
    {
      // Create new 'Car' using record 'Model' & 'Year'.
      Car dataCar = new Car(record[0], record[1]);

      ListCar dbListCar = AddDbType<ListCar>(new ListCar("DbCars"), db);
      DisplayTime("DbCars", dbListCar.Name);

      // Test if 'DataCar' exists otherwise add new item to 'Cars' list.
      MatchCarModel = dataCar.Model;                 // Set 'Model' match item
      if (dbListCar.Cars.FindIndex(CarMatch) < 0)
      {
        // Update database list.
        dbListCar.Cars.Add(dataCar);
        UpdateDbType<ListCar>(dbListCar, db);
        DisplayTime("Car", dataCar.Model);          // New 'Car'
      }
      else
      {
        // Already exists. (Traps Duplicates)
        TimeDuration = -1;
        DisplayTime("Car", dataCar.Model);          // Old 'Car'
      }

      int ndxCar = dbListCar.Cars.FindIndex(CarMatch);
      Car dbCar = dbListCar.Cars[ndxCar];

      return dbCar;  // Persistent reference.
    }

    // Add a new 'Driver' type in database.
    private Driver AddDbDriver(string[] record, IObjectContainer db)
    {
      // Create new 'Driver' using record 'Name' & 'Points'.
      Driver dataDriver = new Driver(record[2], Convert.ToInt32(record[3]));

      ListDriver dbListDriver = AddDbType<ListDriver>(new ListDriver("DbDrivers"), db);
      DisplayTime("DbDrivers", dbListDriver.Name);

      // Test if 'Driver' exists otherwise add new item to 'Drivers' list.
      MatchDriverName = dataDriver.Name;             // Set 'Driver.Name' match item
      if (dbListDriver.Drivers.FindIndex(DriverMatch) < 0)
      {
        // Update database list.
        dbListDriver.Drivers.Add(dataDriver);
        UpdateDbType<ListDriver>(dbListDriver, db);
        DisplayTime("Driver", dataDriver.Name);     // New 'Driver'
      }
      else
      {
        // Already exists.
        TimeDuration = -1;
        DisplayTime("Driver", dataDriver.Name);     // Old 'Driver'
      }

      int ndxDriver = dbListDriver.Drivers.FindIndex(DriverMatch);
      Driver dbDriver = dbListDriver.Drivers[ndxDriver];

      return dbDriver;  // Persistent reference.
    }

    // Add a new 'DbList' type. [Root-DbType]
    private T AddDbType<T>(T type, IObjectContainer db)
    {
      int begTime, endTime;                   // Pocess duration. (millisecs)

      IObjectSet setList = db.Get(type);

      T dbList;
      if (setList.HasNext())
      {
        // DbType already exists in database
        dbList = (T)setList.Next();
        TimeDuration = -1;
      }
      else
      {
        // Add new 'DbList' to database.
        begTime = Environment.TickCount & Int32.MaxValue;  // millisecs
        db.Set(type);
        db.Commit();

        // Retrieve 'DbList' from database.
        IObjectSet resetList = db.Get(type);
        dbList = (T)resetList.Next();
        endTime = Environment.TickCount & Int32.MaxValue;  // millisecs
        TimeDuration = (endTime - begTime);
      }

      return dbList;
    }

    // Update an existing 'DbList' type. [Root-DbType]
    private void UpdateDbType<T>(T dbList, IObjectContainer db)
    {
      int begTime, endTime;                   // Pocess duration. (millisecs)

      // Update existing 'DbList' type to database.
      if (UniqueEnabled)
      {
        // Unique Field Value Constraint block.
        try
        {
          begTime = Environment.TickCount & Int32.MaxValue;  // millisecs
          db.Set(dbList);
          db.Commit();
          endTime = Environment.TickCount & Int32.MaxValue;  // millisecs
          TimeDuration = (endTime - begTime);
        }
        catch (UniqueFieldValueConstraintViolationException exc)
        {
    // Rejects update of new 'Car|Driver' to existing 'DriverCar' caused by constraint.
          Console.WriteLine("Constraint: " + exc.GetBaseException().Message);
          TimeDuration = -1;
          db.Rollback();
        }
      }
      else
      {
        // Non-Unique block.
        begTime = Environment.TickCount & Int32.MaxValue;  // millisecs
        db.Set(dbList);
        db.Commit();
        endTime = Environment.TickCount & Int32.MaxValue;  // millisecs
        TimeDuration = (endTime - begTime);
      }
    }

    // Display 'DbCars'.
    private void DisplayDbCars(IObjectContainer db)
    {
      IQuery query = db.Query();
      query.Constrain(typeof(ListCar));
      IObjectSet setListCars = query.Execute();

      Console.WriteLine(">> Db-Storage: Car-Drivers");
      foreach (ListCar dbListCar in setListCars)
      {
        Console.Write("ListCar=" + dbListCar.Name);
        Console.WriteLine();
        foreach (Car dbCar in dbListCar.Cars)
        {
          Console.Write(" Car=" + dbCar.Model);
          Console.Write(" [" + dbCar.Year + "]");
          Console.Write(" [DriverCnt=" + dbCar.DriverUUIDs.Count + "]");
          Console.WriteLine();
          foreach (Db4oUUID driverUUID in dbCar.DriverUUIDs)
          {
            Driver dbDriver = (Driver)db.Ext().GetByUUID(driverUUID);
            Console.Write("  Driver=" + dbDriver.Name);
            Console.Write(" [" + dbDriver.Points + "]");
            Console.Write(" [UUID=" + driverUUID.GetLongPart() + "]");
            Console.WriteLine();
          }
        }
      }
      Console.WriteLine("---------------------------------------------------------");
    }

    // Define 'ListCar' graph hierarchy. ******************************************
       [+] ListCar                                   [Class reference - Root]
        |->[.] Name                                  [String          – “DbCars”]
        +->[+] Cars                                  [List<Car>       - UUIDKey]
            |->[.] Model                             [String Indexed  - PKey.1]
            |->[.] Year                              [String]
            +->[.] DriverUUIDs                       [List<Db4oUUID>  - FKey]

    // Define 'ListDriver' graph hierarchy. ***************************************
       [+] ListDriver                                [Class reference - Root]
        |->[.] Name                                  [String          - “DbDrivers”]
        +->[+] Drivers                               [List<Driver>    - UUIDKey]
            |->[.] Name                              [String Indexed  - PKey.1]
            |->[.] Points                            [Int32]
            +->[.] CarUUIDs                          [List<Db4oUUID>  - FKey]

    ** Version=db4o 6.2.101 **
    >> In-Memory: SourceData
    Model          Year Driver    Points
    Porsche 911    1994 Al        50    [Rec=1]
    -------------------------------------------------------------------------------
    New-DbCars=DbCars [32]             : AddDbType<ListCar>(new ListCar(“DbCars”), db)
    New-Car=Porsche 911 [15]           : AddDbCar(record, db)
    New-DbDrivers=DbDrivers [0]        : AddDbType<ListCar>(new ListDriver(“DbDrivers”), db)
    New-Driver=Al [0]                  : AddDbDriver(record, db)
    Old-DbCars=DbCars                  : AddDbCarDriverRelation(record, db)
    DriverUUID=38702870769795072       : db.Ext().GetObjectInfo(dbDriver).GetUUID()
    ++Car=Porsche 911 Driver=Al        : UpdateDbType<ListCar>(dbListCar, db)
    New-CarDriver=Al [31]              : dbListCar.Cars[ndxCar].DriverUUIDs.Add(driverUUID)
    >> Db-Storage: Car-Drivers         : DisplayDbCars(db)
    ListCar=DbCars
     Car=Porsche 911 [1994] [DriverCnt=1]
      Driver=Al [50] [UUID=38702870769795072]  : (Driver)db.Ext().GetByUUID(driverUUID)
    -------------------------------------------------------------------------------
    Old-DbDrivers=DbDrivers            : AddDbType<ListDriver>(new ListCar(“DbDrivers”), db)
    Old-Driver=Al                      : AddDbDriver(record, db)
    Old-DbCars=DbCars                  : AddDbType<ListCar>(new ListCar(“DbCars”), db)
    Old-Car=Porsche 911                : AddDbCar(record, db)
    Old-DbDrivers=DbDrivers            : AddDbDriverCarRelation(record, db)
    CarUUID=38702870769270784          : db.Ext().GetObjectInfo(dbCar).GetUUID()
    ++Driver=Al Car=Porsche 911        : UpdateDbType<ListDriver>(dbListDriver, db)
    New-DriverCar=Porsche 911 [16]     : dbListDriver.Drivers[ndxDriver].CarUUIDs.Add(carUUID)
    >> Db-Storage: Driver-Cars         : DisplayDbDrivers(db)
    ListDriver=DbDrivers
     Driver=Al [50] [CarCnt=1]
      Car=Porsche 911 [1994] [UUID=38702870769270784]  : (Car)db.Ext().GetByUUID(carUUID)
    -------------------------------------------------------------------------------
    ** File-Defragment **              : Get same ‘Failed’ result if defrag disabled.
    -------------------------------------------------------------------------------
    >> Db-Storage: Car-Drivers         : DisplayDbCars(db)
    ListCar=DbCars
     Car=Porsche 911 [1994] [DriverCnt=1]
      Driver= [0] [UUID=38702870769795072]     : ** FAILED! **
    -------------------------------------------------------------------------------
    >> Db-Storage: Driver-Cars         : DisplayDbDrivers(db)
    ListDriver=DbDrivers
     Driver=Al [50] [CarCnt=1]
      Car=Porsche 911 [1994] [UUID=38702870769270784]  : ** OK? **

    -------------------------------------------------------------------------------

    Filed under: ,
  •  06-08-2007, 04:07 PM 37331 in reply to 37292

    Re: Unable to ‘Retrieve Objects’ using GetByUUID method

    Hi John Sealey,

    I'll investigate the problem. And It would be very nice if you can upload a whole project (if no legal issue)? 

    Another suggestion is that would you please take a try on the latest version 6.3? Thanks a lot!


    Andrew Zhang » db4objects
    http://zhanghuangzhu.blogspot.com/
  •  06-09-2007, 09:57 AM 37349 in reply to 37331

    Re: Unable to ‘Retrieve Objects’ using GetByUUID method

    Hi Andrew,

    I send you a private email with the code. I also tested against Ver 6.3 with no change in the FAILED results.

    Regards, John Sealey
    Fountain Valley CA
    jojuse@prodigy.net

  •  06-11-2007, 05:16 AM 37371 in reply to 37349

    Re: Unable to ?Retrieve Objects? using GetByUUID method

    JSealey wrote:
    > Hi Andrew,
    >
    > I send you a private email with the code. I also tested against Ver 6.3
    > with no change in the FAILED results.

    Hi Sealey,

    It's reproducible here. I've created a critical jira issue to track this problem:

    http://tracker.db4o.com/browse/COR-676

    Thanks!

    >
    > Regards, John Sealey
    > Fountain Valley CA
    > jojuse@prodigy.net
    >
    >
    > ------------------------------------------------------------------------
    > http://developer.db4o.com/forums/37331/ShowThread.aspx#37349
    >
    Andrew Zhang » db4objects
    http://zhanghuangzhu.blogspot.com/
    Andrew Zhang » db4objects
    http://zhanghuangzhu.blogspot.com/
  •  06-11-2007, 06:28 AM 37372 in reply to 37371

    Re: Unable to ?Retrieve Objects? using GetByUUID method

    Hi Andrew,

    I am glad to see that we are not chasing phantoms! Now I will at least be able to continue to use of Db4Objects and build upon my original techniques.

    Many thanks,  John Sealey

  •  06-13-2007, 02:19 PM 37429 in reply to 37372

    Re: Unable to ?Retrieve Objects? using GetByUUID method

    JSealey:

    Hi Andrew,

    I am glad to see that we are not chasing phantoms! Now I will at least be able to continue to use of Db4Objects and build upon my original techniques.

    Many thanks,  John Sealey

    Hi Sealey,

    I think the problem is caused by "getByUUID" method. Here's the api document of getByUUID:


    This method is intended for replication and for long-term external references to objects. To get a Db4oUUID for an object use getObjectInfo(Object) and ObjectInfo.getUUID().

    Objects will *NOT* be activated by this method. They will be returned in the activation state they are currently in, in the local cache.

    So it needs explicit activation by the user code.

    I simply added the following code in "DisplayDbCars" method:


    db.Activate(dbDriver, 5);

    After retrieving the object by GetByUUID -- Driver dbDriver = (Driver)db.Ext().GetByUUID(driverUUID);

    It works fine. Would you please verify the problem? Thanks a lot!

    btw, Transparent Activation is on the way (http://tracker.db4o.com/browse/COR-111)
     


    Andrew Zhang » db4objects
    http://zhanghuangzhu.blogspot.com/
  •  06-17-2007, 08:12 AM 37522 in reply to 37429

    Re: Unable to ?Retrieve Objects? using GetByUUID method

    Hi Andrew,

    Your absolutely correct!

    Thus, any time that an object is retrieved using IObjectContainer#Ext().GetByUUID(object) one must explicitly apply
    IObjectContainer#Activate(object, depth).

    I read the original warning, but misunderstood... thinking that the global setting was sufficient.
    Db4oFactory.Configure().ActivationDepth(5)

    It is no wonder that 'Transparent Activation' is high on the agenda to be fixed.

    I very much appreciated your time, to ferret out this allusive problem.

    PS: Did you by chance notice the problem of 'Unique Field Constraint' rejecting the update of associated data to an existing key. The concept was introduced early this year in version 6.2, but the 'try-catch' block does not differentiate between updating associated data and the unique field primary key. Is the person who created this concept aware of the problem! If so, maybe a fix is available.

    Regards,  John Sealey
    Foutain Valley, CA
    jojuse@prodigy.net

  •  06-18-2007, 02:33 PM 37541 in reply to 37522

    Re: Unable to ?Retrieve Objects? using GetByUUID method

    JSealey:

    Did you by chance notice the problem of 'Unique Field Constraint' rejecting the update of associated data to an existing key.

    Could you provide us with a small repro?

     Thanks!

    Rodrigo
     

  •  06-20-2007, 09:33 AM 38562 in reply to 37541

    Re: Unable to ?Retrieve Objects? using GetByUUID method

    Upon further examination, I determined the ‘Unique Field Constraint’ problem was fixed. It occurred while focusing on another issue concerning the retrieval of objects using the IObjectContainer#Ext().GetByUUID method. I explicitly separated (isolated) processing of ‘Transient’ vs ‘Persistent’ object references.

    Maybe I should go back to the beginning, and examine how these problems materialized and the revision cycle that occurred to find work arounds. The purpose of this project was to determine the functionality of Db4Objects database with particular emphasis on the following:

    1. Integrity – restricting duplicate items by using ‘Unique Field Constraints’ to define single or composite primary keys and differentiate between ‘adding’ new data and ‘updating’ existing data within a complex graph.
    2. Relations – add and remove soft links using UUIDs between two(2) class objects within a complex graph thus allowing multiple views without creating duplicate datasets. Both ‘Uni-directional’ and ‘Bi-directional’ links.
    3. Performance – check process time duration to ‘add’ new items, ‘update’ existing items or ‘retrieve’ items using a small(00), medium(0000) or large(000000) datasets.

    The first revision used a single graph as follows:

    /* Define 'Car-Driver' graph hierarchy.
    [+] Car                                       [Class reference - Root]
     |->[.] Model                                 [String Indexed  - PKey.1]
     |->[.] Year                                  [String Indexed  - SKey]
     +->[+] Drivers                               [List<Driver>    - FKey]
         |->[.] Name                              [String Indexed  - PKey.2]
         |->[.] Points                            [Int32 Indexed   - SKey]
         +->[-] Cars                              [List<Car>       - Closure]

    This graph failed because ‘duplicate’ items were created when ‘updating’ the database using IObjectContainer#set and #commit methods. I also tried to restrict ‘adding’ new items using ‘Unique Field Constraints’ but it failed due to multiple constraints set within the same graph. (ie: PKey.1 & PKey.2)

    The second revision used a ‘Root’ list to encapsulate the ‘Cars’ as a generic list collection as follows:

    /* Define 'ListCar' graph hierarchy.
    [+] ListCar                                   [Class reference - Root]
     |->[.] Name                                  [String(1) = “DbCars”]
     +->[+] Cars                                  [List<Car>       - FKey]
         |->[.] Model                             [String Indexed  - PKey.1]
         |->[.] Year                              [String Indexed  - SKey]
         +->[+] Drivers                           [List<Driver>    - FKey]
             |->[.] Name                          [String Indexed  - PKey.2]
             |->[.] Points                        [Int32 Indexed   - SKey]
             +->[-] Cars                          [List<Car>       - Closure]

    This graph eliminated the ‘duplicate’ items when ‘updating’ the database. Thus the ListCar class is similar to a relational table and the Cars generic list collection represents the rows. The ‘Unique Field Constraint’ still failed.

    The third revision used two(2) graphs converting the previous graph to 3rd normal form, thus eliminating the multiple constraints within the same graph as follows:

    /* Define 'ListCar' graph hierarchy.
    [+] ListCar                                   [Class reference - Root]
     |->[.] Name                                  [String(1) = “DbCars”]
     +->[+] Cars                                  [List<Car>       - Fkeys.1]
         |->[.] Model                             [String Indexed  - PKey.1]
         |->[.] Year                              [String Indexed  - SKey]
         +->[.] Drivers                           [List<Driver>    - FKey.2]

    /* Define 'ListDriver' graph hierarchy.
    [+] ListDriver                                [Class reference - Root]
     |->[.] Name                                  [String (1) = “DbDrivers”]
     +->[+] Drivers                               [List<Driver>    - FKeys.2]
         |->[.] Name                              [String Indexed  - PKey.2]
         |->[.] Points                            [Int32]
         +->[.] Cars                              [List<Car>       - FKey.1]

    These graphs solved the multiple ‘Unique Field Constraint’ allowing ‘updating’ of existing items but introduced another anomaly. The side effect occurred when I mixed the Cars collection which is ‘Transient’ with the ListCar class which is ‘Persistent’. The AddDataCarDriver method was dependent on four other methods AddDbType<ListCar>, UpdateDbType<ListCar>, AddDataCar and AddDataDriver which intermixed ‘Transient’ and ‘Persistent’ reference instances. This caused the try-catch block to reject the ‘updating’ of the items. This was a very difficult problem to ferret out. The lesson learned is to explicitly separate processing of ‘Transient’ vs ‘Persistent’ references. I now have a set of routines for ‘Transient’ processing as follows:
    AddDataCar, AddDataCarDriver, AddDataDriver and AddDataDriverCar.

    Also a set of routines for ‘Persistent’ processing as follows:
    AddDbType<..>, UpdateDbType<..>, AddDbCar, AddDbCarDriver, AddDbDriver and AddDbDriverCar.

    I still have to test for composite unique field keys (ie: FirstName & LastName) in the ListDriver graph. I suspect that a redundant field will be needed, that combines the FirstName and LastName into one field which is designated as a ‘Unique Field Constraint’.

    The final revision used both inter-related 3rd normal graphs, but instead of creating reference copies between graphs as in revision three, I introduced soft links using the Db4oUUID concept as follows:

    /* Define 'ListCar' graph hierarchy.
    [+] ListCar                                   [Class reference - Root]
     |->[.] Name                                  [String(1) = “DbCars”]
     +->[+] Cars                                  [List<Car>       - UUIDKey.1]
         |->[.] Model                             [String Indexed  - PKey.1]
         |->[.] Year                              [String Indexed  - SKey]
         |->[.] DriverUUIDs                       [List<Db4oUUID>  - UUIDKeys.2]
         +->[.] Drivers     {Transient}           [List<Driver>    - FKeys]

    /* Define 'ListDriver' graph hierarchy.
    [+] ListDriver                                [Class reference - Root]
     |->[.] Name                                  [String one only ='DbDrivers']
     +->[+] Drivers                               [List<Driver>    - UUIDKey.2]
         |->[.] Name                              [String Indexed  - PKey.1]
         |->[.] Points                            [Int32]
         |->[.] CarUUIDs                          [List<Db4oUUID>  - UUIDKeys.1
         +->[.] Cars        {Transient}           [List<Car>       - FKey.2]

    This revision requires an explicit configuration to generate Db4oUUIDs for Cars and Drivers as follows:
    Db4oFactory.Configure().ObjectClass(typeof(Car)).GenerateUUIDs(true);
    Db4oFactory.Configure().ObjectClass(typeof(Driver)).GenerateUUIDs(true);

    Also two(2) new routines (AddDbCarDriverRelation & AddDbDriverCarRelation) are required to add the soft links to the designated inter-related list collections. The Db4oUUIDs are retrieved as follows:
    Db4oUUID driverUUID = db.Ext().GetObjectInfo(dbDriver).GetUUID();
    Db4oUUID carUUID = db.Ext().GetObjectInfo(dbCar).GetUUID();

    They are subsequently tested if they exist, then added to the Cars or Drivers list collection and updated as follows:

    dbListCar.Cars[ndxCar].DriverUUIDs.Add(driverUUID);
    UpdateDbType<ListCar>(dbListCar, db)
    or
    dbListDriver.Drivers[ndxDriver].CarUUIDs.Add(carUUID);
    UpdateDbType<ListDriver>(dbListDriver, db);

    A problem occurred upon retrieval using the IObjectContainer#Ext().GetByUUID(object) method. You must explicitly apply IObjectContainer#Activate(object,depth) otherwise the object returned is empty! Hopefully the ‘Transparent Activation’ will fix this exception to the global activation configuration.

    For me, this has been a very interesting learning experience on how to use Db4Object database and will continue into the future. Hopefully the ‘Fast Collections’ project will provide greatly inproved performance and allow the developer to explicitly manipulate very large lists which require careful consumption of memory.

    I would appreciate any suggestion on how you would navigated through this maze. There were moments when I felt like I was blind folded in the presents of a very large object. Upon removal of the blind fold I discovered an elephant. This subsequent vision impacted and redirected my future endevours.

    Regards,  John Sealey
    Fountain Valley CA