一款.NET下的开源轻量级对象数据库NDatabase
【原创翻译】C#开源轻量级对象数据库NDatabase介绍【原创资料限时奉送】
2013-02-20 09:35 by asxinyu, 1992 阅读, 93 评论, 收藏 , 编辑
今天向大家介绍一款.NET下的开源轻量级对象数据库NDatabase,花了1天时间看了一下文档和一些例子。觉得有必要把一些东西整理成中文文档,也方便大家。本来想把以前的一个小项目改造一下,做一个例子的。无奈,时间不是很充足,还要忙着找工作。所以大家自己看看,这个数据库在某些方面还是很有用的。下面的总计都是按照官方文档进行翻译的,稍微去掉和修改了一些,总结了一下该数据库的一些特点和特性。然后把重点写出来了。简单的增删查改在后门的例子中。翻译水平有限,敬请指点:
1.前言
NDatabase是一个易于使用的.NET 对象数据库。为了避免关系数据库带来的开销,可以尝试用 NDatabase。NDatabase是新一代的面向对象数据库: 1 个原生的 .NET 数据库持久层。它的主要特征有:
简单:NDatabase非常简单,很容易学习上手使用;它 API 是简单,不需要学习任何数据库映射技术;不需要对象和存储持久层之间的映射; NDatabase以最简单的方式存储对象;不需要安装和管理。 小:NDatabase 运行时小于300Kb ,部署程序的时候,很容易集成到 .NET 应用程序中去。 安全健壮:NDatabase支持 ACID 事务处理,保证数据的完整性。即使在硬件故障的情况下,所有的提交工作都会应用到数据库,在下一次启动的时候自动执行。 单一数据库文件:NDatabase使用单一的文件存储所有的数据,包括元数据,对象,索引等。 生产率:NDatabase使用很少的代码来进行数据持久化,不需要映射。因此,开发人员可以专注于业务逻辑的实现,而不是在数据持久层浪费时间。2.NDatabase 入门
2.1 基础设置
NDatabase中所有的数据库引擎设置都在OdbConfiguration类中。如BTree Validation,和BTree index degree的设置都在这个类里面,打开日志的设置也在这个类里面。NDatabase提供了默认的日志类实现:ConsoleLogger,可以使用OdbConfiguration类中的EnableConsoleLogger方法进行设置。实现好自定义的日志类后,还需要进行注册RegisterLogger方法,才能够使用。
1 OdbConfiguration.RegisterLogger( new Log4NetLogger());
2.2 使用索引
使用 IOdb 接口的 IndexManagerFor方法可以为指定类型添加索引,如:
1 using ( var odb = OdbFactory.Open( " index1.ndb " )) 2 3 { 4 5 var fields = new [] { " Name " }; 6 7 odb.IndexManagerFor<Player>().AddUniqueIndexOn( " nameIndex " , fields); 8 9 odb.IndexManagerFor<Game>().AddIndexOn( " nameIndex " , new [] { " Result " }); 10 11 }
2.3 使用事务
NDatabase可以使用事务来保证数据的完整性(ACID:原子性,一致性,隔离性,持久性)。当一个NDatabase被打开后,将会自动创建一个会话,包含一个特殊的当前事务对象,这个事务对象实例管理当前所有的数据和数据操作行为。
2.4 内存数据库模式
NDatabase可以将数据库所有数据直接加载到内存中,直接使用OdbFactory方法的 OpenInMemory即可。
2.5 关于触发器
要增加一个触发器,首先要建立一个实现了Trigger 接口()的类,该接口有4种可用的类型(InsertTrigger,UpdateTrigger,SelectTrigger,DeleteTrigger)。如:
1 public class MyTrigger : InsertTrigger 2 3 { 4 5 public override bool BeforeInsert( object obj) 6 7 { return true ; } 8 9 public override void AfterInsert( object obj, OID oid) 10 11 { } 12 13 }
在使用过程中,打开数据库后,要注册触发器,才能使用:
1 var mage = new Mage( " Merlin " , 3.3 , 3.4 ); 2 3 var myTrigger = new MyTrigger(); 4 5 using ( var odb = OdbFactory.Open( " inserting_trigger.db " )) 6 7 { 8 9 odb.TriggerManagerFor<Mage> ().AddInsertTrigger(myTrigger); 10 11 odb.Store(mage); 12 13 }
2.6 扩展数据库架构
在数据库的使用周期中,类型的定义可能会改变,NDatabase提供了重构管理接口,可以扩展数据库架构,使用IRefactorManager可以重命名类型名称和字段名称,以及增加和删除字段。如下列代码:
1 using ( var odb = OdbFactory.Open( " Refactoring.odb " )) 2 3 { 4 5 var refactorManager = odb.GetRefactorManager(); 6 7 refactorManager.RenameField( typeof (User), " age " , " _age " ); 8 9 refactorManager.RenameField( typeof (User), " name " , " _name " ); 10 11 }
2.7 自定义日志接口
2.1 节中提到了日志的配置,可以自定义日志类,注册后使用,如下所示:
1 public class Log4NetLogger : ILogger 2 3 { 4 5 private static readonly ILog Log = LogManager.GetLogger( typeof (ILogger)); 6 7 #region Implementation of ILogger 8 9 public void Warning( string message) 10 11 { Log.Warn(message); } 12 13 public void Debug( string message) 14 15 { Log.Debug(message);} 16 17 public void Info( string message) 18 19 { Log.Info(message); } 20 21 public void Error( string message) 22 23 { Log.Error(message);} 24 25 public void Error( string message, Exception t) 26 27 { 28 29 Log.Error(message); 30 31 Log.ErrorFormat( " Error: {0}, exception: {1} " , t.Message, t); 32 33 } 34 35 #endregion 36 37 }
2.8 异常处理
NDatabase使用内部的异常处理类型来处理错误,以下是NDatabase中的异常类型:
BTreeException
BTreeNodeValidationException
DuplicatedKeyException
CorruptedDatabaseException
LinqQueryException
2.9 非持久属性
如果有一些属性不想保存到数据库,可以使用 [NonPersistent] 属性。
3.实际使用的几个例子
使用之前当然要先有实体类,例子的实体类采用最简单的,这里有些地方就不写出来了。
3.1 2个保存对象的例子
先看简单的:
1 var sport = new Sport( " volley-ball " ); 2 using ( var odb = OdbFactory.Open(TutorialDb5MinName)) // 打开数据库 3 odb.Store(sport);
再看复杂的:
View Code
3.2 再看看几个简单的查询例子
最简单的,注释就免了,都比较简单
1 using ( var odb = OdbFactory.Open(TutorialDb5MinName)) 2 { 3 var query = odb.Query<Player> (); 4 query.Descend( " Name " ).Constrain( " julia " ).Equal(); 5 var players = query.Execute<Player> (); 6 7 Console.WriteLine( " \nStep 3 (Soda): Players with name julia " ); 8 9 foreach ( var player in players) 10 Console.WriteLine( " \t{0} " , player); 11 12 Assert.That(players, Has.Count.EqualTo( 1 )); 13 }
看看这种,LINQ的查询方式:
using ( var odb = OdbFactory.Open(TutorialDb5MinName)) { var players = from player in odb.AsQueryable<Player> () where player.Name.Equals( " julia " ) select player; Console.WriteLine( " \nStep 3 (Linq): Players with name julia " ); foreach ( var player in players) Console.WriteLine( " \t{0} " , player); Assert.That(players.Count(), Is.EqualTo( 1 )); }
简单的例子就写这么多吧。实际的还有很多灵活的操作,比如比较,查询,还对表直接的关系等等。如果有兴趣,适合你,可以看后面的资源链接。
4.NDatabase资源
1.开源网址: https://ndatabase.codeplex.com/
http://ndatabase.wix.com/home#!overview/c18h9
http://ndatabase.net/
2.教程地址:
官方5分钟入门使用教程
官方1分钟入门使用教程
NDataBase教程及说明文档
官方数据库性能测试及对比
3.自制的 NDatabase类库API帮助文档 和 英文版资料电子书
最给力的是什么,当然是下载了,呵呵。据说,有下载的文章会吸引更多人。
自己动手,丰衣足食。呵呵,做了一份 NDatabase类库API帮助文档 和 英文版资料电子书。
需要的留下邮箱,21日中午12点钟左右发送,仅此一次。写篇文章不容易,希望大家不要吝啬哦。
编程爱好者,关注.NET软件开发,Matlab编程及网络技术
http://www.cnblogs.com/asxinyu/E-mail:asxinyu@qq.com
分类: C#.NET开发 , Xcode开发 , 开源技术
标签: Xcode , 对象容器 , NDatabase , 对象数据库 , .NET对象数据库
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于一款.NET下的开源轻量级对象数据库NDatabase的详细内容...