如何理解C#開源輕量級對象數(shù)據(jù)庫NDatabase,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
10年積累的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有嘉黎免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
今天向大家介紹一款.NET下的開源輕量級對象數(shù)據(jù)庫NDatabase,花了1天時間看了一下文檔和一些例子。覺得有必要把一些東西整理成中文文檔,也方便大家。本來想把以前的一個小項目改造一下,做一個例子的。無奈,時間不是很充足,還要忙著找工作。所以大家自己看看,這個數(shù)據(jù)庫在某些方面還是很有用的。下面的總計都是按照官方文檔進(jìn)行翻譯的,稍微去掉和修改了一些,總結(jié)了一下該數(shù)據(jù)庫的一些特點和特性。然后把重點寫出來了。簡單的增刪查改在后門的例子中。翻譯水平有限,敬請指點:
1.前言
NDatabase是一個易于使用的.NET對象數(shù)據(jù)庫。為了避免關(guān)系數(shù)據(jù)庫帶來的開銷,可以嘗試用NDatabase。NDatabase是新一代的面向?qū)ο髷?shù)據(jù)庫:1個原生的.NET數(shù)據(jù)庫持久層。它的主要特征有:
·簡單:NDatabase非常簡單,很容易學(xué)習(xí)上手使用;它API是簡單,不需要學(xué)習(xí)任何數(shù)據(jù)庫映射技術(shù);不需要對象和存儲持久層之間的映射;NDatabase以最簡單的方式存儲對象;不需要安裝和管理。
·?。篘Database 運(yùn)行時小于300Kb,部署程序的時候,很容易集成到.NET應(yīng)用程序中去。
·安全健壯:NDatabase支持ACID事務(wù)處理,保證數(shù)據(jù)的完整性。即使在硬件故障的情況下,所有的提交工作都會應(yīng)用到數(shù)據(jù)庫,在下一次啟動的時候自動執(zhí)行。
·單一數(shù)據(jù)庫文件:NDatabase使用單一的文件存儲所有的數(shù)據(jù),包括元數(shù)據(jù),對象,索引等。
·生產(chǎn)率:NDatabase使用很少的代碼來進(jìn)行數(shù)據(jù)持久化,不需要映射。因此,開發(fā)人員可以專注于業(yè)務(wù)邏輯的實現(xiàn),而不是在數(shù)據(jù)持久層浪費時間。
2.NDatabase入門
2.1 基礎(chǔ)設(shè)置
NDatabase中所有的數(shù)據(jù)庫引擎設(shè)置都在OdbConfiguration類中。如BTree Validation,和BTree index degree的設(shè)置都在這個類里面,打開日志的設(shè)置也在這個類里面。NDatabase提供了默認(rèn)的日志類實現(xiàn):ConsoleLogger,可以使用OdbConfiguration類中的EnableConsoleLogger方法進(jìn)行設(shè)置。實現(xiàn)好自定義的日志類后,還需要進(jìn)行注冊RegisterLogger方法,才能夠使用。
OdbConfiguration.RegisterLogger(new Log4NetLogger());
2.2 使用索引
使用IOdb接口的IndexManagerFor方法可以為指定類型添加索引,如:
using (var odb = OdbFactory.Open("index1.ndb")) { var fields = new[] { "Name" }; odb.IndexManagerFor().AddUniqueIndexOn("nameIndex", fields); odb.IndexManagerFor ().AddIndexOn("nameIndex", new[] { "Result" }); }
2.3 使用事務(wù)
NDatabase可以使用事務(wù)來保證數(shù)據(jù)的完整性(ACID:原子性,一致性,隔離性,持久性)。當(dāng)一個NDatabase被打開后,將會自動創(chuàng)建一個會話,包含一個特殊的當(dāng)前事務(wù)對象,這個事務(wù)對象實例管理當(dāng)前所有的數(shù)據(jù)和數(shù)據(jù)操作行為。
2.4 內(nèi)存數(shù)據(jù)庫模式
NDatabase可以將數(shù)據(jù)庫所有數(shù)據(jù)直接加載到內(nèi)存中,直接使用OdbFactory方法的 OpenInMemory即可。
2.5 關(guān)于觸發(fā)器
要增加一個觸發(fā)器,首先要建立一個實現(xiàn)了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) { } }
在使用過程中,打開數(shù)據(jù)庫后,要注冊觸發(fā)器,才能使用:
var mage = new Mage("Merlin", 3.3, 3.4); var myTrigger = new MyTrigger(); using (var odb = OdbFactory.Open("inserting_trigger.db")) { odb.TriggerManagerFor().AddInsertTrigger(myTrigger); odb.Store(mage); }
2.6 擴(kuò)展數(shù)據(jù)庫架構(gòu)
在數(shù)據(jù)庫的使用周期中,類型的定義可能會改變,NDatabase提供了重構(gòu)管理接口,可以擴(kuò)展數(shù)據(jù)庫架構(gòu),使用IRefactorManager可以重命名類型名稱和字段名稱,以及增加和刪除字段。如下列代碼:
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é)中提到了日志的配置,可以自定義日志類,注冊后使用,如下所示:
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)部的異常處理類型來處理錯誤,以下是NDatabase中的異常類型:
BTreeException
BTreeNodeValidationException
DuplicatedKeyException
CorruptedDatabaseException
LinqQueryException
2.9 非持久屬性
如果有一些屬性不想保存到數(shù)據(jù)庫,可以使用[NonPersistent]屬性。
3.實際使用的幾個例子
使用之前當(dāng)然要先有實體類,例子的實體類采用最簡單的,這里有些地方就不寫出來了。
3.1 2個保存對象的例子
先看簡單的:
var sport = new Sport("volley-ball"); using (var odb = OdbFactory.Open(TutorialDb5MinName))//打開數(shù)據(jù)庫 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 再看看幾個簡單的查詢例子
最簡單的,注釋就免了,都比較簡單
using (var odb = OdbFactory.Open(TutorialDb5MinName)) { var query = odb.Query(); query.Descend("Name").Constrain("julia").Equal(); var players = query.Execute (); 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的查詢方式:
using (var odb = OdbFactory.Open(TutorialDb5MinName)) { var players = from player in odb.AsQueryable() 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)); }
簡單的例子就寫這么多吧。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。