DB4O设置自增ID的方法详解

数据库
我们知道,DB4O是一个开源的纯面向对象的数据库引擎,我们常常在应用的时候需要设置自增ID,那么如何设置呢?本文我们主要就介绍一下这部分内容,希望能够对您有所帮助。

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

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

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

为对象增加自增ID

解决方案:

 

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

 

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

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

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

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

另一种解决方案:

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

 

/// <summary> 
/// 内部存储使用, 保存每一种类型对象的***一个自增Id  
/// </summary> 
class SerialIdEntity  
{  
public Type ObjectType { get; set; }  
public int NextId { get; set; }  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

 

2. 用Attribute来标记对象的Id自增属性.

 

class SerialIdAttribute : Attribute  
{  
}  
class Book  
{  
[SerialId()]  
public int Id  
{  
get; set;  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

 

3. 持久化时反射检查属性是否有SerialIdAttribute, 若存在则先取出此类型的下一个自增Id, 并自增其类型对应的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 关联子对象(含自增属性)  
//递归遍历子对象  
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;  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.

 

同样的问题:

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

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

【编辑推荐】

  1. Oracle数据库中创建自增字段的代码示例
  2. SQL Server Collation的问题解决及特点分析
  3. 将.sql文件导入powerdesigner的实现方法详解
  4. 手动卸载SQL Server 2005数据库及实例的详细步骤
  5. 以SQL Server 2005为后台的ASP网站访问慢的解决方案
责任编辑:赵鹏 来源: 博客园
相关推荐

2010-10-08 15:42:39

MySQL设置自增字段

2010-03-29 14:09:12

Oracle ID 自

2010-08-31 08:38:55

SQL Server

2022-11-08 19:30:52

DjangoID自增

2010-11-01 14:40:39

DB2自增字段

2024-12-25 15:32:29

2010-09-28 16:14:14

SQL Server自

2018-12-14 15:35:20

MySQL索引数据库

2022-06-03 08:12:52

InnoDB插入MySQL

2024-11-11 00:00:06

MySQLID数据类型

2024-06-14 08:34:36

2010-04-30 12:15:42

Oracle自增ID

2023-10-24 15:27:33

Mysql自增主键

2010-11-29 11:39:11

Sybase自增字段

2010-11-12 10:38:24

SQL Server自

2023-12-26 01:09:28

MySQL存储释放锁

2023-10-17 09:41:04

自增主键MySQL

2010-07-05 11:26:31

2010-04-26 14:03:02

Oracle使用

2011-01-18 09:47:33

自增ID
点赞
收藏

51CTO技术栈公众号