久仰ORM大名由来已久,但真正学习ORM才是前两周的事,在网上挑来拣去,终于决定好好学习一下NHibernate(IBatisNet我也比较感兴趣,但是鉴于时间有限,暂时搁置),一来因为其鼻祖Hibernate名气大,二来嘛,因为它是开源的,有机会看看它的源码,呵呵!
    上网搜了好久,没搜到几篇文档,没法子只能啃Hibernate的文档慢慢学习了,不久我就发现一个问题:NHibernate好像不能同时操作几个数据库嘛?假设有这样分布式系统,它有N个客户端,一个应用程序服务器,多个数据库服务器,客户端可以根据自己的配置通过应用程序服务器连接到不同的数据库服务器(应该就是听棠描述的所谓多帐套),NHibernate应该如何处理这种情况呢?如果了解一点NHibernate的配置的话,大概就知道是通过Configuration.BuildSessionFactory获得ISessionFactory接口的,而通过这种方法我们只能利用连接字符串指定一个默认的数据库,在《在Window Form中使用NHibernate》一文中提到可以通过增加一个配置文件的方式连接到其它的数据库,但按照原文的意思,如果要使用第二个数据库,意味着要第二次进行昂贵的BuildSessionFactory调用,而且假如我们允许用户创建删除数据库的话,配置文件实在是不够灵活,那么有什么办法可以达到我们的目的呢?
    查阅NHibernate的doc,无意中发现OpenSession有个overload的方法,可以提供一个IDbConnection的参数,看来老天有眼,直觉告诉我,就是它了!!!经过实验,只要指定这个参数,就可以轻轻松松实现动态改变连接的数据库了!废话少说,看代码……
    首先是SessionFactory的代码,这里将SessionFactory实现为单例,主要是因为SessionFactory建立极为耗时耗力,这样可以避免重复创建。

using System;
using System.Reflection;
using System.Diagnostics;
using System.Data;

using NHibernate;
using NHibernate.Cfg;

namespace MyProject.Services
{
    public class SessionFactory
    {
        private static Configuration _configuration = null;
        private static ISessionFactory _factory = null;

static SessionFactory()
        {
            _configuration = new Configuration();

_configuration.SetProperty("hibernate.dialect", "NHibernate.Dialect.MsSql2000Dialect");
            _configuration.SetProperty("hibernate.connection.provider",
                "NHibernate.Connection.DriverConnectionProvider");
            _configuration.SetProperty("hibernate.connection.driver_class",
                "NHibernate.Driver.SqlClientDriver");
            _configuration.SetProperty("hibernate.connection.connection_string",
                @"Server=localhost;initial catalog=master;Integrated Security=SSPI");

_configuration.AddAssembly(Assembly.Load("MyProject.Beans"));
            _factory = _configuration.BuildSessionFactory();
        }

public static ISession OpenSession()
        {
            Debug.Assert(_factory != null, "ISessionFactory is null");
            return _factory.OpenSession();
        }

public static ISession OpenSession(IDbConnection connection)
        {
            Debug.Assert(_factory != null, "ISessionFactory is null");
            Debug.Assert(connection != null, "IDbConnection is null");
            return _factory.OpenSession(connection);
        }

public static void Initialize()
        {
            // do nothing, just trigger the static .ctor
        }
    }
}

大家可以发现,我连接的居然master数据库,嘿嘿,不错,这就是奥妙所在了,调用BuildSessionFactory的时候,指定哪个数据库并没有太大关系,你可以指定任何一个数据库都没有问题,当然,这样做的后果就是你必须在OpenSession的时候指定一个连接,否则的话,狠狠,后果自负哦!
    好了,上面就是全部的关键了,接下来就是如何使用的问题了,我这里举个例子,以做抛砖引玉之用:

public static void TestAddUser(User newUser)
        {
            string connstring = @"Server=localhost;initial catalog=gcs2;Integrated Security=SSPI";
            using (SqlConnection conn = new SqlConnection(connstring))
            {
                conn.Open();
                ISession session = SessionFactory.OpenSession(conn as IDbConnection);
                ITransaction transaction = session.BeginTransaction();
                try
                {
                    session.Save(newUser);
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    throw ex;
                }
                finally
                {
                    session.Close();
                }
            }
        }

相关的调用代码如下:

private void btnAdd_Click(object sender, EventArgs e)
        {
            User newUser = new User();
            newUser.Name = "<new user>";
            newUser.Password = "<none>";
            newUser.CreateDate = DateTime.Now;
            newUser.LastLogin = DateTime.Now;
            UserFactory.TestAddUser(newUser);
        }

如果没有问题的话,最终User将被保存到gcs2数据库中,而不是master数据库!事实上,通过改变TestAddUser成员函数中的连接字符串(可以由客户端传过来),你说吧,你想连到哪儿?呵呵!

当然大家也看到了,强行指定connection是以牺牲代码的平台移植性为代价的。我这里就强行指定了SqlConnection作为实际连接,当然,这个问题很好解决,一个简单工厂就绰绰有余了,好,enjoy it!

注:这是本人第一次发表有关NHibernate的文章,而且本人才疏学浅,如有遗漏或错误之处,请各位指正!

C# NHibernate处理多帐套问题相关推荐

  1. oracle外币账套 初始化,Oracle EBS查找帐套本位币及币种间汇率转换的方法

    (1)获取帐套本位币 --取得当前帐套本位币 SELECT gsob.currency_code FROM gl_sets_of_books   gsob, hr_operating_units ho ...

  2. 用友财务帐套升级:T3升级U8

    写下升级经历: 一.安装虚拟机 二.导出T3帐套 T3 10.8plus 三.安装T6软件 T6 6.1 安装Sql Server 数据库及补丁 四.安装T3升级T6软件 五.安装T6升级U8+软件 ...

  3. 用友畅捷通T+,现金流量相关档案从一个帐套复制到另个帐套

    用友畅捷通T+,现金流量相关档案从一个帐套复制到另个帐套的相关表,为下表 SELECT * FROM AA_CashFlowItem SELECT * FROM AA_CashFlowItemClas ...

  4. 开发版速达-提供在线帐套配置功能

    为了让不同的用户选择不同的帐套,开发版速达提供了在线帐套配置功能:(该配置功能与速达程序无法兼容) 一.请在服务端程序中启用在线配置功能: 勾选启用在线帐套配置,至此程序已经支持在线帐套配置功能: 二 ...

  5. show-cloud(七) mybatis-plus的多帐套配置

    以前的show-cloud是单帐套单,并不适合我的要求,需要对mybatis-plus进行扩展,需要将多帐套信息扩张进来. 直接上代码 package org.go.show.cloud.users. ...

  6. 账套显示到期怎么弄_帐套演示期限已到期如何继续使用

    帐套演示期限已到期如何继续使用 用友ERP-U8登陆套账时提示:演示期限已到期,这是怎么回事? 用友软件一般试用期在业务操作3个月之内才行,意思就是你在软件里面业务操作超过了3个月的时间 就无法再以试 ...

  7. 帐套和会计科目的理解

     帐套(Set of Books,简称SOB): 通俗地讲,帐套就是一系列帐簿(如明细帐.总分类 帐等)的组合,我们的财务业务全记录在帐簿中. 从系统角度讲,总帐帐套确定了一个企业所采用的会计 科 ...

  8. AgileEAS.NET SOA平台多帐套的实现

    这里的多帐套的意思是指:程序可以连接到不同的具体数据库. 准备工作: 下载最新平台 本文涉及到两个数据库MulDb1和MulDb2. 这两个数据库都是由平台自带数据库生成工具EAS.DbInitial ...

  9. show-cloud(十一)添加删除帐套的mq队列

    第一步:配置队列 第二步:确认队列是否创建,登陆到rabbitMq的web管理界面 第三步:对show-cloud-users-service添加相应对依赖 <dependency>< ...

最新文章

  1. 清华 词向量库_word2vec 构建中文词向量
  2. MNIST数据库介绍及转换
  3. Python 字典(Dictionary)
  4. 由浅入深:自己动手开发模板引擎——置换型模板引擎(四)
  5. zabbix API 删除host
  6. C++Primer Plus (第六版)阅读笔记 + 源码分析【目录汇总】
  7. 干货 | 算法工程师入门第一期——罗恒讲深度学习
  8. vue如何引入ant部分组件
  9. Flink中的容错机制
  10. Of Study - Francis Bacon
  11. 激光雷达和相机联合标定 之 开源代码和软件汇总 (2004-2021)
  12. web performance in action学习前言
  13. 如何成为一名优秀的web前端工程师(前端攻城师)
  14. Bzoj4011 [HNOI2015]落忆枫音
  15. win10或11非华为电脑安装最新的电脑管家(支持移动应用引擎)安装方法及问题解决
  16. okhttp请求使用cookie
  17. Gradle基础:4:Task的使用方式
  18. PGPool-II 4.2.1+PostgreSQL 13高可用
  19. HTML和web窗体的区别(转载)
  20. 景深决定照相机什么特性_2017年摄影专业单独考试试题库——简答

热门文章

  1. svga文件预览_Android动画SVGA的使用
  2. excel怎么设置自动计算_钢筋计算太麻烦?全套钢筋翻样Excel自动计算表,限时分享...
  3. For-For循环嵌套(大圈套小圈思想)
  4. 前端基础HTML、CSS--6(CSS-3)
  5. 低学历计算机工作,非常适合低学历考生学习的5大技术,就业容易且高薪,可安身立命...
  6. 基于android的运动app,毕业设计(论文)-基于Android的手机运动的APP设计与实现.doc...
  7. 使用 Pytesseract 进行光学字符识别
  8. 【BOI2007】Mokia 摩基亚
  9. ps --sort排序功能
  10. 若依框架 - - - 自定义打印模版