本次主要内容:修正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. SQL中条件放在on后与where后的区别

    SQL中on条件与where条件的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: ...

  2. Ubuntu环境下的Redis 配置与C++使用入门

      Redis是一个高性能的key-value数据库. Redisedis的出现,非常大程度补偿了memcached这类key/value存储的不足,在部分场合能够对关系数据库起到非常好的补充作用.它 ...

  3. js的逻辑 OR 运算符- ||

    逻辑or运算大家都很熟悉,都会用.但是在javascript中用的更多,用的更妙.有时候用它来解决兼容问题特别方面.简洁. 比如获取鼠标对象.在 Internet Explorer 里,  event ...

  4. Hadoop之环境搭建

    初学Hadoop之环境搭建   阅读目录 1.安装CentOS7 2.安装JDK1.7.0 3.安装Hadoop2.6.0 4.SSH无密码登陆 本文仅作为学习笔记,供大家初学Hadoop时学习参考. ...

  5. Linux应用环境

    转载Linux应用环境 阅读目录 引言 使用 Linux 的一些困难和解决方法 我眼中的Linux哲学总纲 我这一系列随笔中展现出的Linux哲学 Linux之得和Linux之失 总结 回到顶部 引言 ...

  6. 第一个JavaWeb程序

    转载 第一个JavaWeb程序 JavaWeb学习总结第二篇—第一个JavaWeb程序 最近我在学院工作室学习并加入到研究生的项目中,在学长学姐的带领下,进入项目实践中,为该项目实现一个框架(用已有框 ...

  7. Spring该讲座

    看看今天Spring. 国内搞Java开发的朋友们.对Spring一定不会陌生. Spring的历史? 谈起Spring.就会想起Ejb2.0.虽然.现实中有非常多基于Ejb2.0的成功系统,可是Ej ...

  8. POJ 2255 Tree Recovery 二叉树恢复

    一道和Leetcode的一道题目基本上一样的题目. 给出前序遍历和中序遍历序列,要求依据这些信息恢复一颗二叉树的原貌,然后按后序遍历序列输出. Leetcode上有给出后序和中序,恢复二叉树的. 只是 ...

  9. sql注入工具sqlmap使用参数说明

    Options(选项):--version 显示程序的版本号并退出-h, --help 显示此帮助消息并退出-v VERBOSE 详细级别:0-6(默认为1)Target(目标):以下至少需要设置其中 ...

  10. php生成签名及验证签名

    <?php /** * 根据原文生成签名内容 * * @param string $data 原文内容 * * @return string * @author confu */ functio ...