本博客所有文章分類的總目錄:【總目錄】本博客博文總目錄-實時更新
本博客其他.NET開源項目文章目錄:【目錄】本博客其他.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方法,才能夠使用。
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
1 var volleyball = new Sport("volley-ball"); 2 3 var player1 = new Player("julia", DateTime.Now, volleyball); 4 var player2 = new Player("magdalena", DateTime.Now, volleyball); 5 var player3 = new Player("jacek", DateTime.Now, volleyball); 6 var player4 = new Player("michal", DateTime.Now, volleyball); 7 8 var team1 = new Team("Krakow"); 9 var team2 = new Team("Skawina"); 10 11 team1.AddPlayer(player1); 12 team1.AddPlayer(player2); 13 14 team2.AddPlayer(player3); 15 team2.AddPlayer(player4); 16 17 var game = new Game(DateTime.Now, volleyball, team1, team2); 18 19 using (var odb = OdbFactory.Open(TutorialDb5MinName)) 20 odb.Store(game);
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
2.教程地址:
