日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
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

解決方案:

 
 
 
  1. Book book = new Book();  
  2. book.Id = ?;  
  3. Db4oFactory.OpenFile("Data.dat").Store(book); 

 

DB4O手冊上說, 不推薦對象使用Id屬性, 但這明顯是對這個問題的回避:

對某些數(shù)據(jù)應(yīng)用而言, 如訂單, 流水線等, 自增Id是必不可少的, 此時,如果采用DB4O作存儲的話:

1. 不得不手動查詢得到當前***Id然后持久化;

2. 對于復(fù)雜對象而言, 則需要遞歸檢查,確保每一級子對象自增Id都設(shè)置正確。這個是讓人難以接受的。

另一種解決方案:

1. 在DB4O中存儲一組 (類型 =>NextId) 對象, 用來保存每種持久化對象的Type和該類型的下一個自增Id值.

 
 
 
  1. ///  
  2. /// 內(nèi)部存儲使用, 保存每一種類型對象的***一個自增Id  
  3. ///  
  4. class SerialIdEntity  
  5. {  
  6. public Type ObjectType { get; set; }  
  7. public int NextId { get; set; }  

 

2. 用Attribute來標記對象的Id自增屬性.

 
 
 
  1. class SerialIdAttribute : Attribute  
  2. {  
  3. }  
  4. class Book  
  5. {  
  6. [SerialId()]  
  7. public int Id  
  8. {  
  9. get; set;  
  10. }  

 

3. 持久化時反射檢查屬性是否有SerialIdAttribute, 若存在則先取出此類型的下一個自增Id, 并自增其類型對應(yīng)的NextId, 然后存儲.

 
 
 
  1. ///  
  2. /// 保存對象: 檢查自增字段  
  3. ///  
  4. ///  
  5. public static void Add(object obj)  
  6. {  
  7. Type t = obj.GetType();  
  8. foreach (var p in t.GetProperties())  
  9. {  
  10. #region 自增屬性  
  11. SerialIdAttribute[] ids = (SerialIdAttribute[]p.GetCustomAttributes(typeof(SerialIdAttribute), false);  
  12. if (ids.Length > 0)  
  13. {  
  14. SerialIdAttribute id = ids[ids.Length - 1];  
  15. p.SetValue(obj, GenerateNexId(t), null);  
  16. }  
  17. #endregion  
  18. #region 關(guān)聯(lián)子對象(含自增屬性)  
  19. //遞歸遍歷子對象  
  20. object subObj = p.GetValue(obj, null);  
  21. //...  
  22. #endregion  
  23. }  
  24. Db4oFactory.OpenFile("Data.dat").Store(obj);  
  25. }  
  26. private static int GenerateNexId(Type t)  
  27. {  
  28. SerialIdEntity sid;  
  29. var res = from so in Db4oFactory.OpenFile("Data.dat").Query()  
  30. where so.ObjectType == t  
  31. select so;  
  32. List data = res.ToList();  
  33. if (data.Count > 0)  
  34. {  
  35. sid = data[0];  
  36. }  
  37. else  
  38. {  
  39. sid = new SerialIdEntity(){ ObjectType = t };  
  40. }  
  41. sid.NextId++;  
  42. Db4oFactory.OpenFile("Data.dat").Store(sid);  
  43. 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ū)δ兴斋@!


當前文章:DB4O設(shè)置自增ID的方法詳解
新聞來源:http://www.5511xx.com/article/djejgho.html