DB4O设置自增ID的方法详解

DB4O是一种开源的纯面向对象的数据库引擎,它带给了我们***的ORM体验:

  • 直接存储对象
  • 直接查询, 更新, 删除对象
  • 直接支持LINQ
  • 无需创建表结构, 更无需维护数据库
  • 超小的数据库引擎, 不到800KB
  • 原生支持C#和JAVA
  • 性能高效

而我们在使用的过程中常常需要设置自增ID,那么如何设置呢?接下来我们就开始介绍。

为对象增加自增ID

解决方案:

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

 

DB4O手册上说, 不推荐对象使用Id属性, 但这明显是对这个问题的回避:

对某些数据应用而言, 如订单, 流水线等, 自增Id是必不可少的, 此时,如果采用DB4O作存储的话:

1. 不得不手动查询得到当前***Id然后持久化;

2. 对于复杂对象而言, 则需要递归检查,确保每一级子对象自增Id都设置正确。这个是让人难以接受的。

另一种解决方案:

1. 在DB4O中存储一组 (类型 =>NextId) 对象, 用来保存每种持久化对象的Type和该类型的下一个自增Id值.

 
 
 
  1. ///  
  2. /// 内部存储使用, 保存每一种类型对象的***一个自增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, 并自增其类型对应的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 关联子对象(含自增属性)  
  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;  

 

同样的问题:

对复杂对象而言, 对象中关联子对象, 存储时需要递归遍历检查自己的属性及子对象的属性.DB4O中的ID SYSTEM有两种. 一个是物理ID(即指向对象镜像存储位置的指针), 一个是UUID(需要在创建数据库时指定配置项), 都与自增无关。

关于DB4O设置自增ID的方法就介绍到这里了,希望本次的介绍能够对您有所收获!

分享标题:DB4O设置自增ID的方法详解
网页网址:http://www.hantingmc.com/qtweb/news47/412997.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联