标签: db4o

分享Db4o的便捷封装类源码

导言 大家好,话说真是好久好久没写文章了,哈哈。 最近在写网站,个人对传统数据库天然抵触,感觉非常繁冗,即便是Entity Framework也过于庞杂了,Db4o这种轻量级且读写、配置都极其方便的新型数据库非常适合我。 不过我发现Db4o这么多年发展下来,竟然仍旧没多少中文资料可寻,很奇怪为什么这么优秀的数据库国内使用率极低呢?于是我就想尝试自己来写一些心得什么的,为Db4o在国内的传播尽微薄之力吧。 此次分享的是自己写的工具类代码,封装了Db4o的一种基本使用方式,高度优化了调用体验,下面直接介绍用法,源代码在文章末尾贴出。 初始化 如果是桌面应用的话,那就在程序开始时直接初始化即可: /// <summary> /// Db4o服务器管理器 /// </summary> public static Db4oServerManager Db4oServerManager=new Db4oServerManager(“db.db4o”); 如果是网站,建议在Global.asax里作为网站核心类的静态属性,并在网站启动时初始化: public class Mv...

更多

关于db4o的透明激活与激活声明

有关于透明激活,其介绍可以参看这里:http://www.cnblogs.com/redmoon/archive/2008/02/23/1078619.html 文中指出通过透明激活特性,db4o能够帮我们自动处理激活层次问题,使得对象的属性为非基础类型时也能够自动按需加载。 我不明白其运作原理是如何的,但很坦然地使用了它,直到遇到一个加载集合属性的子项总为空时,挠墙无解~ 一度怀疑是db4o对类继承的支持存在BUG~ 后来发觉声明全部层次激活(Db4oFactory.Configure().ObjectClass(typeof(MyClass1)).CascadeOnActivate(true))后,那个属性就能够成功获取了,可见这个问题还是源自透明激活——它还不够智能 引发问题的属性是一个List<>集合属性,而其他属性别管是基础类型还是自定类型的都没问题,所以猜测也许是透明激活还未对集合支持。 关于激活声明,还有点要注意的,例如以下这种激活层次说明: Db4oFactory.Configure().ObjectClass(typeof(MyCl...

更多

Db4o中需要严格警惕类的继承问题

先来看一个简易类图: 如果你打算将这样的类存储在Db4o中的话,那么会很容易产生灵异现象,我今天就亲历了…… 为产品对象添加一个附图后保存,下次重新开启数据库时读取到的产品的附图仍然是空的,而如果你在数据库中检索照片的话,你还是能找到你用作附图的照片对象的,但就是没法和产品对象关联起来,无论设定透明激活、层叠激活还是指定深度激活,都没有任何效果,简直太恼人了。 简单猜想来就是Db4o数据库中将类的继承搞的比较乱,导致引用断开,对象孤立。 然而,上图还只是一个示意的简图,我在实际项目中,产品的附图属性是一个照片对象的集合,还有一个封面图片属性,对应的是一个单独的照片对象,此外产品还有一个产品分类属性,对应的是产品分类的集合对象,产品分类又继承自分类,也继承自基类,使用时产品分类属性是完全没有问题的,其他两个则都如上文所述的情况一般无法获取,这又让人很难将问题完全归结于继承所致。 最后经过N多次尝试,将所有类简化为无继承的简单类型,问题就解决了,错误原理仍然不明,有待日后研究。   2010年10月3日  经再次盘查,最终导致问题解决的原因不是剔...

更多

关于Db4o的查询测试及疑惑

在Entity Framework中,我们通过Take()方法可以仅取得指定数量的数据,并且Entity Framework也只是从数据库中取出指定数量的数据而直接返回。 而Db4o虽然也可以在原生查询(NQ)之后追加Take()方法,但是经我测试认为其工作方式仍然是将所有数据先取出,然后再从所有数据中返回前五条……   测试过程 首先建立两个简单的类,用于对比测试: public class 男人{    public 男人(int 年龄)    {        this.年龄 = 年龄;    }    public int 年龄 { get; set; }    public override string ToString()    {     &...

更多

Db4o结合Linq、Lambda表达式的简单示例

大多数人接触Db4o的查询,都是从“样本查询”(Query by Example)开始的,这种查询方式简单但不方便,功能和性能也很受局限。以下是引自官方的样本查询示例: // retrievePilotByName Pilot proto=new Pilot(“Michael Schumacher”,0); ObjectSet result=db.get(proto); listResult(result); 这种查询要求我们先建立一个样本,然后再交由Db4o根据此样本返回符合条件的数据,其主要的不便之处在于对类默认值的处理及组合条件查询上,同时其执行性能是很差的。 而当Db4o开始支持.Net 3.5之后,我们就有了更为简单且又十分方便而强大的选择了,让我们来一起领略Db4o与.Net 3.5擦出的火花之美吧:   准备工作 首先创建一个命令行应用程序。 书写一个简单的“学生”类: public class 学生{    static Random R = new Random();  ...

更多