MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作
本次主要内容:修正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框架 六:支持多数据库操作的更多相关文章
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 一
本人系新接触MongoDB不久,属于MongoDB的菜鸟范畴.在使用MongoDB的过程中,总结了一些认识,在此总结跟大家分享.欢迎拍砖. 关于MongoDB的内容,在此就不做介绍了,网上有浩如烟海的 ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 三
本次改动的主要内容是实现MongoDB.Repository在MongoDB中建立索引. 建立索引主要使用MongoDB的官方驱动中EnsureIndex方法. 在MongoDB.Repository ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 二
本次改动的主要内容是实现MongoDB.Repository对MongoDBRef的支持. MongoDB对一对一,一对多,多对多关系的维护,官方推荐文档嵌入方式,反映到模型的设计如下: public ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 --- 为List<MongoDBRef>增加扩展方法
本次改动主要内容:为List<MongoDBRef>增加扩展方法 在MongoDB.Repository的使用过程中,发现在一个类中只定义一个List<MongoDBRef>是 ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 四
本次改动主要实现MongoGridFS功能.实现方式主要使用了MongoGridFS和MongoGridFSFileInfo两个类. 设计思路:定义一个IMongoFile接口并继承IEntity,以 ...
- MongoDB Python官方驱动 PyMongo 的简单封装
最近,需要使用 Python 对 MongodB 做一些简单的操作,不想使用各种繁重的框架.出于可重用性的考虑,想对 MongoDB Python 官方驱动 PyMongo 做下简单封装,百度一如既往 ...
- 在.net下打造mongoDb基于官方驱动最新版本
还是一如既往先把结构图放出来,上上个版本添加了redis的缓存,但是不满足我的需求,因为公司有项目要求是分布式所以呢,这里我就增加了mongoDb进行缓存分布式,好了先看结构图. 总的来说比较蛋疼,因 ...
- 使用MongoDB C#官方驱动操作MongoDB
想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...
- 在C#中使用官方驱动操作MongoDB
MongoDB的官方驱动下载地址:https://github.com/mongodb/mongo-csharp-driver/releases 目前最新的版本是2.10,支持.NET 4.5以上.由 ...
随机推荐
- 关于通过id查询记录的一些总结
最近在做一个oa系统,简化了账号的设置,列名均为id,类型均为varchar:有的表将id设置成了主键,有的表没有设置成主键. 通过举例说明通过id查询的一些问题. 之前登陆的时候,账号001-007 ...
- [Android] Upload package to device fails #2720
错误描述: 解决办法: 来源:https://facebook.github.io/react-native/docs/android-setup.html
- 我的MYSQL学习心得(七)
原文:我的MYSQL学习心得(七) 我的MYSQL学习心得(七) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...
- C#-简单的定时器(C# ConsoleApp) ---ShinePans
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpbmVwYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- idea类似eclipse鼠标技巧java api信息
版权声明:本文博客原创文章,博客,未经同意,不得转载.
- MVC自定义分页
MVC自定义分页 之前我发表了一篇MVC无刷新分页的文章,里面用的是MvcPager控件,但是那个受那个控件限制,传值只能用PagedList,各方面都受到了限制,自由度不够高,现在还是做MVC无刷新 ...
- HDOJ 4416 Good Article Good sentence
题解转自:http://blog.csdn.net/dyx404514/article/details/8807440 2012杭州网络赛的一道题,后缀数组后缀自己主动机都行吧. 题目大意:给一个字符 ...
- selenium2入门 用testNG对百度首页输入框进行测试 (三)
如果还没有安装testNG的亲,可以点击http://www.cnblogs.com/milanmi/p/4346580.html查看安装过程. 这节主要是对百度首页的输入框进行输入测试. packa ...
- windows 7 telnet 开启关闭
win7运行telnet提示:'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件 原因:win7默认没有打开此功能 解决方案:控制面板->程序和功能->打开或关闭wind ...
- Ora创建job定时执行某存储过程
--创建job任务,每天晚上8点执行存储过程:por_postrecords-- declare job number; begin sys.dbms_job.submit(job =>job, ...