C#開(kāi)源輕量級(jí)對(duì)象數(shù)據(jù)庫(kù)NDatabase介紹
今天向大家介紹一款.NET下的開(kāi)源輕量級(jí)對(duì)象數(shù)據(jù)庫(kù)NDatabase,花了1天時(shí)間看了一下文檔和一些例子。覺(jué)得有必要把一些東西整理成中文文檔,也方便大家。本來(lái)想把以前的一個(gè)小項(xiàng)目改造一下,做一個(gè)例子的。無(wú)奈,時(shí)間不是很充足,還要忙著找工作。所以大家自己看看,這個(gè)數(shù)據(jù)庫(kù)在某些方面還是很有用的。下面的總計(jì)都是按照官方文檔進(jìn)行翻譯的,稍微去掉和修改了一些,總結(jié)了一下該數(shù)據(jù)庫(kù)的一些特點(diǎn)和特性。然后把重點(diǎn)寫(xiě)出來(lái)了。簡(jiǎn)單的增刪查改在后門(mén)的例子中。翻譯水平有限,敬請(qǐng)指點(diǎn):
1.前言
NDatabase是一個(gè)易于使用的.NET對(duì)象數(shù)據(jù)庫(kù)。為了避免關(guān)系數(shù)據(jù)庫(kù)帶來(lái)的開(kāi)銷(xiāo),可以嘗試用NDatabase。NDatabase是新一代的面向?qū)ο髷?shù)據(jù)庫(kù):1個(gè)原生的.NET數(shù)據(jù)庫(kù)持久層。它的主要特征有:
·簡(jiǎn)單:NDatabase非常簡(jiǎn)單,很容易學(xué)習(xí)上手使用;它API是簡(jiǎn)單,不需要學(xué)習(xí)任何數(shù)據(jù)庫(kù)映射技術(shù);不需要對(duì)象和存儲(chǔ)持久層之間的映射;NDatabase以最簡(jiǎn)單的方式存儲(chǔ)對(duì)象;不需要安裝和管理。
·?。篘Database 運(yùn)行時(shí)小于300Kb,部署程序的時(shí)候,很容易集成到.NET應(yīng)用程序中去。
·安全健壯:NDatabase支持ACID事務(wù)處理,保證數(shù)據(jù)的完整性。即使在硬件故障的情況下,所有的提交工作都會(huì)應(yīng)用到數(shù)據(jù)庫(kù),在下一次啟動(dòng)的時(shí)候自動(dòng)執(zhí)行。
·單一數(shù)據(jù)庫(kù)文件:NDatabase使用單一的文件存儲(chǔ)所有的數(shù)據(jù),包括元數(shù)據(jù),對(duì)象,索引等。
·生產(chǎn)率:NDatabase使用很少的代碼來(lái)進(jìn)行數(shù)據(jù)持久化,不需要映射。因此,開(kāi)發(fā)人員可以專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而不是在數(shù)據(jù)持久層浪費(fèi)時(shí)間。
2.NDatabase入門(mén)
2.1 基礎(chǔ)設(shè)置
NDatabase中所有的數(shù)據(jù)庫(kù)引擎設(shè)置都在OdbConfiguration類(lèi)中。如BTree Validation,和BTree index degree的設(shè)置都在這個(gè)類(lèi)里面,打開(kāi)日志的設(shè)置也在這個(gè)類(lèi)里面。NDatabase提供了默認(rèn)的日志類(lèi)實(shí)現(xiàn):ConsoleLogger,可以使用OdbConfiguration類(lèi)中的EnableConsoleLogger方法進(jìn)行設(shè)置。實(shí)現(xiàn)好自定義的日志類(lèi)后,還需要進(jìn)行注冊(cè)RegisterLogger方法,才能夠使用。
- OdbConfiguration.RegisterLogger(new Log4NetLogger());
2.2 使用索引
使用IOdb接口的IndexManagerFor方法可以為指定類(lèi)型添加索引,如:
- using (var odb = OdbFactory.Open("index1.ndb"))
- {
- var fields = new[] { "Name" };
- odb.IndexManagerFor<Player>().AddUniqueIndexOn("nameIndex", fields);
- odb.IndexManagerFor<Game>().AddIndexOn("nameIndex", new[] { "Result" });
- }
2.3 使用事務(wù)
NDatabase可以使用事務(wù)來(lái)保證數(shù)據(jù)的完整性(ACID:原子性,一致性,隔離性,持久性)。當(dāng)一個(gè)NDatabase被打開(kāi)后,將會(huì)自動(dòng)創(chuàng)建一個(gè)會(huì)話(huà),包含一個(gè)特殊的當(dāng)前事務(wù)對(duì)象,這個(gè)事務(wù)對(duì)象實(shí)例管理當(dāng)前所有的數(shù)據(jù)和數(shù)據(jù)操作行為。
2.4 內(nèi)存數(shù)據(jù)庫(kù)模式
NDatabase可以將數(shù)據(jù)庫(kù)所有數(shù)據(jù)直接加載到內(nèi)存中,直接使用OdbFactory方法的 OpenInMemory即可。
2.5 關(guān)于觸發(fā)器
要增加一個(gè)觸發(fā)器,首先要建立一個(gè)實(shí)現(xiàn)了Trigger 接口()的類(lèi),該接口有4種可用的類(lèi)型(InsertTrigger,UpdateTrigger,SelectTrigger,DeleteTrigger)。如:
- public class MyTrigger : InsertTrigger
- {
- public override bool BeforeInsert(object obj)
- { return true; }
- public override void AfterInsert(object obj, OID oid)
- { }
- }
在使用過(guò)程中,打開(kāi)數(shù)據(jù)庫(kù)后,要注冊(cè)觸發(fā)器,才能使用:
- 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);
- }
2.6 擴(kuò)展數(shù)據(jù)庫(kù)架構(gòu)
在數(shù)據(jù)庫(kù)的使用周期中,類(lèi)型的定義可能會(huì)改變,NDatabase提供了重構(gòu)管理接口,可以擴(kuò)展數(shù)據(jù)庫(kù)架構(gòu),使用IRefactorManager可以重命名類(lèi)型名稱(chēng)和字段名稱(chēng),以及增加和刪除字段。如下列代碼:
- using (var odb = OdbFactory.Open("Refactoring.odb"))
- {
- var refactorManager = odb.GetRefactorManager();
- refactorManager.RenameField(typeof(User), "age", "_age");
- refactorManager.RenameField(typeof(User), "name", "_name");
- }
2.7 自定義日志接口
2.1節(jié)中提到了日志的配置,可以自定義日志類(lèi),注冊(cè)后使用,如下所示:
- 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
- }
2.8 異常處理
NDatabase使用內(nèi)部的異常處理類(lèi)型來(lái)處理錯(cuò)誤,以下是NDatabase中的異常類(lèi)型:
BTreeException
BTreeNodeValidationException
DuplicatedKeyException
CorruptedDatabaseException
LinqQueryException
2.9 非持久屬性
如果有一些屬性不想保存到數(shù)據(jù)庫(kù),可以使用[NonPersistent]屬性。
3.實(shí)際使用的幾個(gè)例子
使用之前當(dāng)然要先有實(shí)體類(lèi),例子的實(shí)體類(lèi)采用最簡(jiǎn)單的,這里有些地方就不寫(xiě)出來(lái)了。
3.1 2個(gè)保存對(duì)象的例子
先看簡(jiǎn)單的:
- var sport = new Sport("volley-ball");
- using (var odb = OdbFactory.Open(TutorialDb5MinName))//打開(kāi)數(shù)據(jù)庫(kù)
- odb.Store(sport);
再看復(fù)雜的:
- 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);
3.2 再看看幾個(gè)簡(jiǎn)單的查詢(xún)例子
最簡(jiǎn)單的,注釋就免了,都比較簡(jiǎn)單
- 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));
- }
看看這種,LINQ的查詢(xún)方式:
- 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));
- }
簡(jiǎn)單的例子就寫(xiě)這么多吧。實(shí)際的還有很多靈活的操作,比如比較,查詢(xún),還對(duì)表直接的關(guān)系等等。如果有興趣,適合你,可以看后面的資源鏈接。
4.NDatabase資源
1.開(kāi)源網(wǎng)址:
https://ndatabase.codeplex.com/
http://ndatabase.wix.com/home#!overview/c18h9
2.教程地址:
官方數(shù)據(jù)庫(kù)性能測(cè)試及對(duì)比
原文鏈接:http://www.cnblogs.com/asxinyu/archive/2013/02/20/2918066.html