在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本博客所有文章分类的总目录:【总目录】本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:【目录】本博客其他.NET开源项目文章目录 今天向大家介绍一款.NET下的开源轻量级对象数据库NDatabase,花了1天时间看了一下文档和一些例子。觉得有必要把一些东西整理成中文文档,也方便大家。本来想把以前的一个小项目改造一下,做一个例子的。无奈,时间不是很充足,还要忙着找工作。所以大家自己看看,这个数据库在某些方面还是很有用的。下面的总计都是按照官方文档进行翻译的,稍微去掉和修改了一些,总结了一下该数据库的一些特点和特性。然后把重点写出来了。简单的增删查改在后门的例子中。翻译水平有限,敬请指点: NDatabase是一个易于使用的.NET对象数据库。为了避免关系数据库带来的开销,可以尝试用NDatabase。NDatabase是新一代的面向对象数据库:1个原生的.NET数据库持久层。它的主要特征有:
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.教程地址: |
请发表评论