切换相同映射表的数据库

时间:2012-04-12 13:05:27

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我使用Fluent NHibernate并且现在必须使用归档数据,其中多个MSSQL数据库上存在相同的表。根据用户提供的日期值,我必须连接到不同的数据库,而所有映射信息保持不变。

更具体:如果提供的日期值在当前年份内,请使用数据库CUR,否则使用年度数据库(2011年,2010年,2009年,...)。

现在有一段时间人们告诉我一遍又一遍地重新创建SessionFactory是一件非常昂贵的事情,所以我想我必须有办法使用现有的sessionFactory,更新我的ClassMap(比如将Schema从“CUR.DBO”更改为“2011.DBO”并重新连接。

我尝试了FluentConfiguration和SessionFactory,但是 然后我在膝盖上拿了一个箭头 找不到在运行时刷新映射的方法。

我最终会创建一个新的SessionFactory吗?或者有没有人知道在运行时重新初始化(流畅)NHibernate的映射的可行程序?

编辑:一个非常重要的细节,SqlConnection也是外部提供的。它提供对所有数据库的访问,这意味着理论上我永远不必创建Connections。所以,基本上我要做的就是为每个Archive创建一个SessionFactory来更新Mapping的Schema信息,指向另一个数据库。但这正是我被困的地方。

3 个答案:

答案 0 :(得分:1)

创建会话工厂确实比创建会话要昂贵得多,因此您当然不希望为数据库的每个查询创建一个。

但是,根据我的经验,最多只需要几秒钟。

我建议你每次用户选择不同年份时都要创建一个新的。如果你在发生这种情况时给予他们很好的反馈(可能是一个对话框,上面写着“连接到2010数据库”,带有进度条),他们可能不介意等待。

一旦你创建了一年,如果他们在同一年进行更多的查询,你可以重复使用它,所以他们每年只需要等待一次查询。

如果创建会话工厂的时间过长,我会看到有关如何保存或缓存配置以减少创建时间的帖子。然而,一个快速的谷歌没有找到任何好的链接,所以你可能不得不研究,或提出另一个问题。

答案 1 :(得分:1)

感谢您的回复/评论。实际上我还没有找到重用会话工厂的方法,所以我最终按照建议为它们创建了一个查找列表。以下解决方案做我需要的(更改数据库),我们将如何执行:

    private IDictionary<string, ISessionFactory> _sessionFactories;

    public SqlConnection Connection { get; set; }

    public ISessionFactory GetSessionFactory(string dbName)
    {
        if (_sessionFactories.ContainsKey(dbName))
        {
            return _sessionFactories[dbName];
        }

        FluentConfiguration cfg = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
                                                                .ShowSql()
                                                                .ConnectionString(c=>c.Is(Connection.ConnectionString)))
                                                      .Mappings(x=>x.FluentMappings.Add<MappedClassMap>());
        cfg.ExposeConfiguration(x => x.GetClassMapping(typeof(MappedClass)).Table.Schema = string.Format("{0}.dbo",dbName));
        ISessionFactory sf = cfg.BuildSessionFactory();
        _sessionFactories.Add(dbName, sf);
        return sf;
    }

答案 2 :(得分:0)

如果为单个数据库创建了sessionfactory,那似乎就足够了。但是在使用Sessionfactory实例打开一个会话时,可以使用重载方法为dbc​​onnection对象提供切换数据库的位置。已经验证它并且工作正常。

相关问题