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的方法就介绍到这里了,希望本次的介绍能够对您有所收获!
【编辑推荐】