C#开源轻量级对象数据库NDatabase介绍

开发 后端
NDatabase是一个易于使用的.NET对象数据库。为了避免关系数据库带来的开销,可以尝试用NDatabase。NDatabase是新一代的面向对象数据库:1个原生的.NET数据库持久层。它的主要特征有以下几点。

 

今天向大家介绍一款.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方法,才能够使用。

OdbConfiguration.RegisterLogger(new Log4NetLogger()); 
  • 1.

2.2 使用索引

使用IOdb接口的IndexManagerFor方法可以为指定类型添加索引,如:

using (var odb = OdbFactory.Open("index1.ndb")) 
 { 
     var fields = new[] { "Name" }; 
     odb.IndexManagerFor<Player>().AddUniqueIndexOn("nameIndex", fields); 
     odb.IndexManagerFor<Game>().AddIndexOn("nameIndex"new[] { "Result" }); 
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

2.3 使用事务

NDatabase可以使用事务来保证数据的完整性(ACID:原子性,一致性,隔离性,持久性)。当一个NDatabase被打开后,将会自动创建一个会话,包含一个特殊的当前事务对象,这个事务对象实例管理当前所有的数据和数据操作行为。

2.4 内存数据库模式

NDatabase可以将数据库所有数据直接加载到内存中,直接使用OdbFactory方法的 OpenInMemory即可。 

2.5 关于触发器

要增加一个触发器,首先要建立一个实现了Trigger 接口()的类,该接口有4种可用的类型(InsertTrigger,UpdateTrigger,SelectTrigger,DeleteTrigger)。如:

public class MyTrigger : InsertTrigger 
 { 
     public override bool BeforeInsert(object obj) 
     { return true; }  
     public override void AfterInsert(object obj, OID oid) 
     { } 
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

在使用过程中,打开数据库后,要注册触发器,才能使用:

var mage = new Mage("Merlin", 3.3, 3.4); 
 var myTrigger = new MyTrigger();  
 using (var odb = OdbFactory.Open("inserting_trigger.db")) 
 { 
     odb.TriggerManagerFor<Mage>().AddInsertTrigger(myTrigger); 
     odb.Store(mage); 
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

2.6 扩展数据库架构

在数据库的使用周期中,类型的定义可能会改变,NDatabase提供了重构管理接口,可以扩展数据库架构,使用IRefactorManager可以重命名类型名称和字段名称,以及增加和删除字段。如下列代码:

using (var odb = OdbFactory.Open("Refactoring.odb")) 
 { 
     var refactorManager = odb.GetRefactorManager(); 
     refactorManager.RenameField(typeof(User), "age""_age"); 
     refactorManager.RenameField(typeof(User), "name""_name"); 
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

2.7 自定义日志接口

2.1节中提到了日志的配置,可以自定义日志类,注册后使用,如下所示:

public class Log4NetLogger : ILogger 
 { 
     private static readonly ILog Log = LogManager.GetLogger(typeof (ILogger));  
     #region Implementation of ILogger  
     public void Warning(string message) 
     {  Log.Warn(message); }  
     public void Debug(string message) 
     {  Log.Debug(message);}  
     public void Info(string message) 
     {  Log.Info(message); }  
     public void Error(string message) 
     {  Log.Error(message);}  
     public void Error(string message, Exception t) 
     { 
         Log.Error(message); 
         Log.ErrorFormat("Error: {0}, exception: {1}", t.Message, t); 
     } 
     #endregion 
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

2.8 异常处理

NDatabase使用内部的异常处理类型来处理错误,以下是NDatabase中的异常类型:

BTreeException

BTreeNodeValidationException

DuplicatedKeyException

CorruptedDatabaseException

LinqQueryException

2.9 非持久属性

如果有一些属性不想保存到数据库,可以使用[NonPersistent]属性。 

3.实际使用的几个例子

使用之前当然要先有实体类,例子的实体类采用最简单的,这里有些地方就不写出来了。

3.1  2个保存对象的例子

先看简单的:

var sport = new Sport("volley-ball"); 
using (var odb = OdbFactory.Open(TutorialDb5MinName))//打开数据库 
    odb.Store(sport); 
  • 1.
  • 2.
  • 3.

再看复杂的:

View Code  
 var volleyball = new Sport("volley-ball"); 
 var player1 = new Player("julia", DateTime.Now, volleyball); 
 var player2 = new Player("magdalena", DateTime.Now, volleyball); 
 var player3 = new Player("jacek", DateTime.Now, volleyball); 
 var player4 = new Player("michal", DateTime.Now, volleyball); 
 var team1 = new Team("Krakow"); 
 var team2 = new Team("Skawina"); 
 team1.AddPlayer(player1); 
 team1.AddPlayer(player2); 
 team2.AddPlayer(player3); 
 team2.AddPlayer(player4); 
 var game = new Game(DateTime.Now, volleyball, team1, team2); 
 using (var odb = OdbFactory.Open(TutorialDb5MinName)) 
     odb.Store(game); 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

3.2 再看看几个简单的查询例子

最简单的,注释就免了,都比较简单

using (var odb = OdbFactory.Open(TutorialDb5MinName)) 
 { 
     var query = odb.Query<Player>(); 
     query.Descend("Name").Constrain("julia").Equal(); 
     var players = query.Execute<Player>(); 
     Console.WriteLine("\nStep 3 (Soda): Players with name julia"); 
     foreach (var player in players) 
         Console.WriteLine("\t{0}", player); 
     Assert.That(players, Has.Count.EqualTo(1)); 
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

看看这种,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)); 
} 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

简单的例子就写这么多吧。实际的还有很多灵活的操作,比如比较,查询,还对表直接的关系等等。如果有兴趣,适合你,可以看后面的资源链接。

4.NDatabase资源

1.开源网址:

https://ndatabase.codeplex.com/ 

http://ndatabase.wix.com/home#!overview/c18h9

http://ndatabase.net/

2.教程地址:

官方5分钟入门使用教程

官方1分钟入门使用教程

NDataBase教程及说明文档

官方数据库性能测试及对比

原文链接:http://www.cnblogs.com/asxinyu/archive/2013/02/20/2918066.html

 

责任编辑:张伟 来源: 博客园
相关推荐

2023-11-24 11:11:08

Python数据库

2022-05-16 07:37:58

SQL 编辑器数据库管理工具

2009-08-24 18:09:13

C#调用Oracle数

2025-02-06 08:06:05

2009-09-04 17:23:21

C#数据库连接对象

2009-08-28 13:03:55

C#压缩Access数

2009-07-17 14:38:51

轻量级Swing组件

2023-12-13 08:22:45

SQLite关系型数据库

2024-01-09 08:50:32

LiteDB数据库NoSQL

2009-09-03 17:21:51

C# VSProjec

2021-12-06 15:11:34

鸿蒙HarmonyOS应用

2024-04-18 09:56:16

2009-08-11 13:35:13

C# Berkeley

2021-08-31 14:58:52

鸿蒙HarmonyOS应用

2011-08-25 15:35:18

Lua游戏对象

2009-03-19 10:08:09

C#数据库查询

2009-08-25 17:28:23

C#创建DataSet

2011-07-04 15:14:49

C#

2010-10-26 15:21:11

连接Oracle数据库

2022-08-31 12:48:48

TinyDBPython数据库
点赞
收藏

51CTO技术栈公众号