导言

大家好,话说真是好久好久没写文章了,哈哈。

最近在写网站,个人对传统数据库天然抵触,感觉非常繁冗,即便是Entity Framework也过于庞杂了,Db4o这种轻量级且读写、配置都极其方便的新型数据库非常适合我。

不过我发现Db4o这么多年发展下来,竟然仍旧没多少中文资料可寻,很奇怪为什么这么优秀的数据库国内使用率极低呢?于是我就想尝试自己来写一些心得什么的,为Db4o在国内的传播尽微薄之力吧。

此次分享的是自己写的工具类代码,封装了Db4o的一种基本使用方式,高度优化了调用体验,下面直接介绍用法,源代码在文章末尾贴出。

初始化

如果是桌面应用的话,那就在程序开始时直接初始化即可:

        /// <summary>/// Db4o服务器管理器/// </summary>public static Db4oServerManager Db4oServerManager=new Db4oServerManager("db.db4o");

如果是网站,建议在Global.asax里作为网站核心类的静态属性,并在网站启动时初始化:

    public class MvcApplication : System.Web.HttpApplication{/// <summary>/// Db4o服务器管理器/// </summary>public static Db4oServerManager Db4oServerManager;protected void Application_Start(){AreaRegistration.RegisterAllAreas();FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);Db4oServerManager = new Db4oServerManager(Server.MapPath(System.Configuration.ConfigurationManager.ConnectionStrings["db4o"].ConnectionString));}public override void Dispose(){Db4oServerManager.Dispose();base.Dispose();}}

然后记得在Web.config里配置数据库存放路径:

    <connectionStrings><add name="db4o" connectionString="/App_Data/db.db4o"/></connectionStrings>

调用方法

注:下文以网站项目为例

建议采用Lambda表达式方法调用:

                    //无返回值调用方法MvcApplication.Db4oServerManager.Access(q =>{//查找相同ID的对象,以进行更新,否则直接存储将存储为新对象var u = q.Query<ApplicationUser>(t => t.Id == user.Id).First();u.用户信息.名称 = model.DisplayName;//必须明确存储子对象才能得到正确更新,因为默认貌似没有开启级联更新(新建对象存储时会默认自动存储子对象,但更新对象时不会自动更新子对象)
                        q.Store(u.用户信息);});

                    //有返回值调用方法return MvcApplication.Db4oServerManager.AccessAndReturn(q => q.Query<WebSite.Models.ApplicationUser>(t => t.UserName == User.Identity.GetUserName()).First().用户信息.名称)

下面是传统一些的调用方式:

            using (var dbsa = MvcApplication.Db4oServerManager.CreatAccessor()){var finduser = dbsa.Query<TUser>(q => q.Id == user.Id).FirstOrDefault();dbsa.Delete(finduser);}

源代码

    /// <summary>/// Db4o服务器访问器。注意,对数据进行修改后必须释放此对象才能真正的将更改提交到服务器。建议配合using(var dbsa=new Db4oServerAccessor(...)){...}语句使用/// </summary>// ReSharper disable once InconsistentNamingpublic class Db4oServerAccessor : IDisposable{// ReSharper disable once InconsistentNamingprivate IObjectContainer DBContainer { get; set; }/// <summary>/// 构造函数/// </summary>/// <param name="serverManager">Db4o服务器管理器</param>public Db4oServerAccessor(Db4oServerManager serverManager){DBContainer = serverManager.OpenClient();}public void Store(object o){DBContainer.Store(o);}public IDb4oLinqQuery<T> Query<T>(Predicate<T> p){return from T q in DBContainer where p(q) select q;}public IDb4oLinqQuery<T> QueryAll<T>(){return from T q in DBContainer select q;}public int Count<T>(IDb4oLinqQuery<T> collection){return collection.Count();}public int CountAll<T>(){return QueryAll<T>().Count();}public int Count<T>(Predicate<T> p){return Query(p).Count();}public int CountAllByExt<T>(){foreach (var storedClass in DBContainer.Ext().StoredClasses()){if (storedClass.GetName() == typeof(T).FullName) return storedClass.InstanceCount();}return 0;}public void Delete(object o){DBContainer.Delete(o);}public void Delete<T>(Predicate<T> p){foreach (var f in Query<T>(p)){Delete(f);}}#region IDisposable 成员public void Dispose(){DBContainer.Dispose();}#endregion}

    /// <summary>/// Db4o服务器管理器/// </summary>// ReSharper disable once InconsistentNamingpublic class Db4oServerManager : IDisposable{private IObjectServer _db4OServer;private readonly string _dbFilePath;/// <summary>/// 构造函数/// </summary>/// <param name="dbFilePath">数据库文件路径,通常使用Server.MapPath("/xxxx/xx.xx")函数获取到。</param>public Db4oServerManager(string dbFilePath){_dbFilePath = dbFilePath;OpenServer();}private void OpenServer(){IServerConfiguration serverConfig = Db4oClientServer.NewServerConfiguration();_db4OServer = Db4oClientServer.OpenServer(serverConfig, _dbFilePath, 0);}/// <summary>/// 开启一个客户端实例/// </summary>/// <returns>客户端实例</returns>public IObjectContainer OpenClient(){Begin:try{return _db4OServer.OpenClient();}catch{OpenServer();goto Begin;}}/// <summary>/// 创建一个服务器访问器对象。注意,对数据进行修改后必须释放此对象才能真正的将更改提交到服务器。/// </summary>/// <returns>一个服务器访问器对象</returns>public Db4oServerAccessor CreatAccessor(){return new Db4oServerAccessor(this);}/// <summary>/// 创建并访问一个服务器访问器对象。/// </summary>/// <param name="action">对服务器访问器对象的操作行为</param>public void Access(Action<Db4oServerAccessor> action){using (var dba = CreatAccessor()){action(dba);}}/// <summary>/// 创建并访问一个服务器访问器对象,继而获得返回值。/// </summary>/// <param name="action">对服务器访问器对象的操作行为</param>/// <typeparam name="T">返回值类型</typeparam>public T AccessAndReturn<T>(Func<Db4oServerAccessor,T> action){T v = default(T);using (var dba = CreatAccessor()){v= action(dba);//System.Diagnostics.Debug.WriteLine(v.ToString());
            }return v;}#region IDisposable 成员public void Dispose(){_db4OServer.Dispose();}#endregion}

结语

最后容我再郑重向大家强力推荐一下Db4o,真心的,桌面、网站、移动无往不利,你值得拥有。

转载于:https://www.cnblogs.com/SkyD/p/3574651.html

分享Db4o的便捷封装类源码相关推荐

  1. I-EIM分享一套局域网通讯源码

    通讯员就羡慕得不得了,有一棵棵高达挺拔的白杨, 飞鸽传书 今年内首次载人飞行即将付诸实现,汕头市强大的团队决定将小公园规划为历史风貌保护区,骄傲,我痛下决心,他还有灵活的双手,正在铲着路上的积雪,一定 ...

  2. 计算机毕业设计ssm基于SSM的美妆分享网站vf952系统+程序+源码+lw+远程部署

    计算机毕业设计ssm基于SSM的美妆分享网站vf952系统+程序+源码+lw+远程部署 计算机毕业设计ssm基于SSM的美妆分享网站vf952系统+程序+源码+lw+远程部署 本源码技术栈: 项目架构 ...

  3. 分享88个ASP.NET源码,总有一款适合您

    分享88个ASP.NET源码,总有一款适合您 88个ASP.NET源码下载链接:https://pan.baidu.com/s/1jf4rcro_f5rncUd6E-IxrQ?pwd=ou78  提取 ...

  4. 计算机毕业设计ssm文理读书分享平台8xkh2系统+程序+源码+lw+远程部署

    计算机毕业设计ssm文理读书分享平台8xkh2系统+程序+源码+lw+远程部署 计算机毕业设计ssm文理读书分享平台8xkh2系统+程序+源码+lw+远程部署 本源码技术栈: 项目架构:B/S架构 开 ...

  5. 分享45个Android实例源码

    分享45个Android实例源码,很好很强大.收藏吧!!! 分享45个android实例源码,很好很强大 http://www.apkbus.com/android-20978-1-1.html an ...

  6. 分享45个android实例源码,很好很强大

    链接地址:http://www.apkbus.com/android-20978-1-1.html 分享45个android实例源码,很好很强大 http://www.apkbus.com/andro ...

  7. 计算机毕业设计ssm儿童成长记录与分享系统cc35g系统+程序+源码+lw+远程部署

    计算机毕业设计ssm儿童成长记录与分享系统cc35g系统+程序+源码+lw+远程部署 计算机毕业设计ssm儿童成长记录与分享系统cc35g系统+程序+源码+lw+远程部署 本源码技术栈: 项目架构:B ...

  8. 分享99个ASP电子商务源码,总有一款适合您

    分享99个ASP电子商务源码,总有一款适合您 99个ASP电子商务源码下载链接:https://pan.baidu.com/s/1cj5sd3JmxgHHYz5uerwFMw?pwd=skc2  提取 ...

  9. 分享2款设备管理系统源码:Springboot医院设备管理+物联网云监控IOT设备管理

    淘源码:国内专业的免费源码下载平台 今天分享两套设备管理系统源码,一套是Springboot医院设备管理系统,另一套是php物联网iot设备管理系统,需要源码学习的小伙伴可私信我. ▶▶▶1:Spri ...

最新文章

  1. 【声源定位】 球面散乱数据插值方法/似然估计hybrid spherical interpolation/maximum likelihood (SI/ML) 麦克风阵列声源定位
  2. 网易云信直播sdk的整体传输优化
  3. 白话设计模式——Builder
  4. 零基础学Python(第十九章 File操作·IO流补充章节)
  5. 一个Excel导出类的实现过程(二):显示定制
  6. 性能测试的重要意义(一)
  7. java定向输出程序日志(输出到txt文件中)
  8. mysql中credit,CREDIT项目:我国类风湿关节炎数据库建设开启
  9. 第三节基础篇—SQL的约束
  10. 华为荣耀9升降级系统 | 华为荣耀9变砖后如何救砖 | 华为荣耀9获取BL解锁码以及如何解BL锁 | 华为荣耀9如何通过写ramdisk.img来获取root
  11. CCS7.0从安装到使用
  12. 如何搭建Vue开发环境的步骤
  13. 四旋翼无人机飞控系统设计(基础知识篇)
  14. re 中 报错 no such group
  15. IPv6/IPv4是什么?IPv4和IPv6有什么区别?
  16. MATLAB实现LSBR并采用卡方分析进行分析
  17. 淘宝用户行为分析项目报告
  18. httpcanary和fiddler的使用教程
  19. Cesium火灾动画(模型动画,粒子特效)
  20. MyBatis SQL里的大于号、小于号

热门文章

  1. Qt之QProcess(一)运行cmd命令
  2. TW实习日记:第16天
  3. 提升你的开发效率,10 个 NPM 使用技巧
  4. github 开源 代码 学习 集合(转载)
  5. javascript校验2
  6. nginx+mysql+php+cacti+rrdtool全方位架构急速版
  7. 如何在Word里面自动生成目录
  8. 机器学习在本体中的应用研究文献综述
  9. git中使用fork
  10. 深度学习之 OHEM (Online Hard Example Mining)