DB4O設(shè)置自增ID的方法詳解
DB4O是一種開源的純面向?qū)ο蟮臄?shù)據(jù)庫引擎,它帶給了我們***的ORM體驗:
- 直接存儲對象
 - 直接查詢, 更新, 刪除對象
 - 直接支持LINQ
 - 無需創(chuàng)建表結(jié)構(gòu), 更無需維護數(shù)據(jù)庫
 - 超小的數(shù)據(jù)庫引擎, 不到800KB
 - 原生支持C#和JAVA
 - 性能高效
 
而我們在使用的過程中常常需要設(shè)置自增ID,那么如何設(shè)置呢?接下來我們就開始介紹。
為對象增加自增ID
解決方案:
- Book book = new Book();
 - book.Id = ?;
 - Db4oFactory.OpenFile("Data.dat").Store(book);
 
DB4O手冊上說, 不推薦對象使用Id屬性, 但這明顯是對這個問題的回避:
對某些數(shù)據(jù)應(yīng)用而言, 如訂單, 流水線等, 自增Id是必不可少的, 此時,如果采用DB4O作存儲的話:
1. 不得不手動查詢得到當(dāng)前***Id然后持久化;
2. 對于復(fù)雜對象而言, 則需要遞歸檢查,確保每一級子對象自增Id都設(shè)置正確。。。這個是讓人難以接受的。
另一種解決方案:
1. 在DB4O中存儲一組 (類型 =>NextId) 對象, 用來保存每種持久化對象的Type和該類型的下一個自增Id值.
- /// <summary>
 - /// 內(nèi)部存儲使用, 保存每一種類型對象的***一個自增Id
 - /// </summary>
 - class SerialIdEntity
 - {
 - public Type ObjectType { get; set; }
 - public int NextId { get; set; }
 - }
 
2. 用Attribute來標(biāo)記對象的Id自增屬性.
- class SerialIdAttribute : Attribute
 - {
 - }
 - class Book
 - {
 - [SerialId()]
 - public int Id
 - {
 - get; set;
 - }
 - }
 
3. 持久化時反射檢查屬性是否有SerialIdAttribute, 若存在則先取出此類型的下一個自增Id, 并自增其類型對應(yīng)的NextId, 然后存儲.
- /// <summary>
 - /// 保存對象: 檢查自增字段
 - /// </summary>
 - /// <param name="?"></param>
 - public static void Add(object obj)
 - {
 - Type t = obj.GetType();
 - foreach (var p in t.GetProperties())
 - {
 - #region 自增屬性
 - SerialIdAttribute[] ids = (SerialIdAttribute[]p.GetCustomAttributes(typeof(SerialIdAttribute), false);
 - if (ids.Length > 0)
 - {
 - SerialIdAttribute id = ids[ids.Length - 1];
 - p.SetValue(obj, GenerateNexId(t), null);
 - }
 - #endregion
 - #region 關(guān)聯(lián)子對象(含自增屬性)
 - //遞歸遍歷子對象
 - object subObj = p.GetValue(obj, null);
 - //...
 - #endregion
 - }
 - Db4oFactory.OpenFile("Data.dat").Store(obj);
 - }
 - private static int GenerateNexId(Type t)
 - {
 - SerialIdEntity sid;
 - var res = from so in Db4oFactory.OpenFile("Data.dat").Query<SerialIdEntity>()
 - where so.ObjectType == t
 - select so;
 - List<SerialIdEntity> data = res.ToList();
 - if (data.Count > 0)
 - {
 - sid = data[0];
 - }
 - else
 - {
 - sid = new SerialIdEntity(){ ObjectType = t };
 - }
 - sid.NextId++;
 - Db4oFactory.OpenFile("Data.dat").Store(sid);
 - return sid.NextId;
 - }
 
同樣的問題:
對復(fù)雜對象而言, 對象中關(guān)聯(lián)子對象, 存儲時需要遞歸遍歷檢查自己的屬性及子對象的屬性.DB4O中的ID SYSTEM有兩種. 一個是物理ID(即指向?qū)ο箸R像存儲位置的指針), 一個是UUID(需要在創(chuàng)建數(shù)據(jù)庫時指定配置項), 都與自增無關(guān)。
關(guān)于DB4O設(shè)置自增ID的方法就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】
 
 
 
 














 
 







 