2011年9月23日 星期五

db4o 物件的唯一性:disconnected objects 的概念與 web apps

db4o 在單一 object container 的環境下,在物件管理上會確保儲存在資料庫內的物件的唯一性。但是,若是啟用了 client-server 或是 session-container 的架構,則會變成多 object-container 的情況,因此同一個物件可能會在不同的 container 中有不同的 memory identity。這種情況在 web 環境下一定會發生。這時候就要借助額外的 ID,如 db4o 內建的內部 ID:UUID,或是自行產生 ID。

簡而言之,最重要的概念就是加入 EventRegistry,在建立時去檢查是否有 ID 已經存在:

// register 
IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(icontainer);
eventRegistry.Creating += delegate(object sender, CancellableObjectEventArgs args)
{
    if (args.Object is Article)
    {
        Article a = (Article)args.Object;
        if (a.HasDb4oID()) {                       
           // don't insert because Article is already
           // in the container
           args.Cancel();
           Article existing = LookupArticle(icontainer, a.Db4oID) as Article;
           // merge change
           existing.MergeChanges(a);
       } else {
           a.SetDb4oID(a.ArticleID);
       }
    }    
};

相關參考資料如下:

1 則留言:

H.-J.Dai 提到...

Check http://developer.db4o.com/Blogs/Product/tabid/167/entryid/36/Default.aspx