本次主要内容:修正MongoDB.Repository框架对多数据库的支持。

在之前的五篇文章中对MongoDB.Repository框架做了简单的介绍是实现思路。之前是考虑MongoDB.Repository框架是可以同时支持多数据,且已实现支持多数据库。但有个前提:实体的类型不能重复,即一个实体类型(即命名空间一样)只能存在一个数据库中。举例,X实体,如果注册在了A数据库,那么将不能注册在B数据库中。

虽然实现了该功能,但是存在一些问题和不足:

问题:只有在使用具体的实例进行数据库操作时才会提示异常,且异常信息不清楚。

不足:文件操作还未能支持多数据库,因为之前的版本对IMongoFile没有在IMongoDBContext上下文进行注册,所有的文件都会保存到一个数据库中。

当然以上的问题,如果不需要支持多数据库,那么也就不存在这些问题。而在实际的设计中,却很难避免。比如我们如果要做一个简单的平台,出于安全、独立等因素,用户信息和应用信息应该是分开的数据库部署。

本次修正内容:

A:将实体注册放置在上下文注册之前,即在注册上下文之前,首先要检查该上下文中注册的实体是否已经被其它上下文注册过。

B:IMongoFile的实体也需要在上下文中进行注册,不能对未注册的文件类型进行操作。并将MongoFile设置为abstract class,以保证注册流程。

下面给出一个具体的注册案例:

    public class Company : Entity
{ } public class Factory : Entity
{  } public class CompanyDBContext : MongoDBContext
{
public CompanyDBContext() : base("CompanyDBContext") { }
public override void OnRegisterModel(ITypeRegistration registration)
{
registration.RegisterType<Company>().RegisterType<Factory>(); //一次注册
}
} public class FactoryDBContext : MongoDBContext
{
public FactoryDBContext() : base("FactoryDBContext") { }
public override void OnRegisterModel(ITypeRegistration registration)
{
registration.RegisterType<Factory>(); //二次注册
}
} //注册上下文
MongoDBRepository.RegisterMongoDBContext(new CompanyDBContext());
MongoDBRepository.RegisterMongoDBContext(new FactoryDBContext()); //因Factory进行了多次注册,在此会抛出类型多次注册异常

如果需要使用文件,那么文件实体也一样需要注册,这在之前的版本并非强制,也存在一定的问题:

    public class MyFile : MongoFile
{
public MyFile()
: base(@"c:\testxml.xml", "test.xml", "xml")
{ }
} public class TestDBContext : MongoDBContext
{
public TestDBContext() : base("TestDBContext") { } public override void OnRegisterModel(ITypeRegistration registration)
{
registration.RegisterType<MyFile>(); //注册文件实体
}
}

文件实体注册后,即可以使用,使用方式与其他实体无异:

            //加载本地文件,并实例一个IMongoFile
IMongoFile file = MongoEntity.CreateFile<MyFile>(@"c:\pic1.jpg", "pic2.jpg", "jpg"); //下载文件,等同于文件另存为
file.Download(@"c:\beforesave.jpg"); //文件保存至数据库
file.Save(); //从数据中加载刚才保存的文件
IMongoFile fs = MongoEntity.LoadFile<MyFile>(file.Id); //将从数据中加载的文件下载
fs.Download(@"c:\aftersave.jpg"); //根据数据库中的文件名检索文件
var files = MongoEntity.LoadAllFiles<MyFile>("pic2.jpg"); //根据文件id,将数据库中的文件下载到本地
MongoEntity.DownloadFile<MyFile>(file.Id, @"c:\copy.jpg");

以上列出了一些文件的简单操作,并不是全部,每个方法也有不同程度的重载,并在以后根据实际使用情况会逐步的增加。

欢迎大家下载DLL使用,并在使用过程中提出问题,共同改善,源码地址,分享快乐!

MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作的更多相关文章

  1. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 一

    本人系新接触MongoDB不久,属于MongoDB的菜鸟范畴.在使用MongoDB的过程中,总结了一些认识,在此总结跟大家分享.欢迎拍砖. 关于MongoDB的内容,在此就不做介绍了,网上有浩如烟海的 ...

  2. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 三

    本次改动的主要内容是实现MongoDB.Repository在MongoDB中建立索引. 建立索引主要使用MongoDB的官方驱动中EnsureIndex方法. 在MongoDB.Repository ...

  3. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 二

    本次改动的主要内容是实现MongoDB.Repository对MongoDBRef的支持. MongoDB对一对一,一对多,多对多关系的维护,官方推荐文档嵌入方式,反映到模型的设计如下: public ...

  4. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 --- 为List<MongoDBRef>增加扩展方法

    本次改动主要内容:为List<MongoDBRef>增加扩展方法 在MongoDB.Repository的使用过程中,发现在一个类中只定义一个List<MongoDBRef>是 ...

  5. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 四

    本次改动主要实现MongoGridFS功能.实现方式主要使用了MongoGridFS和MongoGridFSFileInfo两个类. 设计思路:定义一个IMongoFile接口并继承IEntity,以 ...

  6. MongoDB Python官方驱动 PyMongo 的简单封装

    最近,需要使用 Python 对 MongodB 做一些简单的操作,不想使用各种繁重的框架.出于可重用性的考虑,想对 MongoDB Python 官方驱动 PyMongo 做下简单封装,百度一如既往 ...

  7. 在.net下打造mongoDb基于官方驱动最新版本

    还是一如既往先把结构图放出来,上上个版本添加了redis的缓存,但是不满足我的需求,因为公司有项目要求是分布式所以呢,这里我就增加了mongoDb进行缓存分布式,好了先看结构图. 总的来说比较蛋疼,因 ...

  8. 使用MongoDB C#官方驱动操作MongoDB

    想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...

  9. 在C#中使用官方驱动操作MongoDB

    MongoDB的官方驱动下载地址:https://github.com/mongodb/mongo-csharp-driver/releases 目前最新的版本是2.10,支持.NET 4.5以上.由 ...

随机推荐

  1. [LeetCode] 033. Search in Rotated Sorted Array (Hard) (C++)

    指数:[LeetCode] Leetcode 解决问题的指数 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 033. ...

  2. Android开发之控制Toast的开启与关闭

    开发这个程序之前先解释一下,为什么Toast信息提示框在显示一定时间后会自己主动消失?由于在Android系统中有一个Toast队列,系统会依次从这个队列中取出一个Toast,并显示它.在显示了指定时 ...

  3. Cgroup maintainer丽泽范:解剖Linux核心容器技术

    摘要:Cgroup和namespace等内核特性如何出现,在社区处于如何的开发状况?Docker如火如荼.内核社区是否会因此加紧完好容器技术的隔离性安全性?华为Linux内核高级project师李泽帆 ...

  4. c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制

    1.功能覆盖 ClassA , ClassB ,其中ClassB继承ClassA 类的定义如下面的: #ifndef _CLASSA_H #define _CLASSA_H #include < ...

  5. Winform中node.Text重命名时窗口无响应假死的解决方法

    用户控件中有一个树,窗体使用了这个控件,但是重命名时执行node.text="XXXX" 执行了很长时间,大约9s,在此期间winform界面假死,尝试过多线程异步委托的方式来操作 ...

  6. LSM树存储模型

    ----<大规模分布式存储系统:原理解析与架构实战>读书笔记 之前研究了Bitcask存储模型,今天来看看LSM存储模型,两者尽管同属于基于键值的日志型存储模型.可是Bitcask使用哈希 ...

  7. ThinkPHP框架设计与扩展总结

    详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一 ...

  8. WPF中嵌入WinForm中的webbrowser控件

    原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能 ...

  9. C# ASP.NET CSV文件导入数据库

    原文:C# ASP.NET CSV文件导入数据库 using System; using System.Collections.Generic; using System.Text; using Sy ...

  10. apache启动报错:the requested operation has failed解决办法

    原因一:80端口占用 例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突 装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp ...