NHibernate 连接多数据库怎么配置

 我来答
美图赏
2016-08-24 · 知道合伙人数码行家
美图赏
知道合伙人数码行家
采纳数:2638 获赞数:24292
毕业于河南大学电子信息科学与技术专业,学士学位,擅长计算机网络技术。

向TA提问 私信TA
展开全部

在开发一些项目时,会使用到多个数据库。例如类A保存在数据库A,类B保存在数据库B。NHibernate在BuildSessionFactory之后,ISessionFactory就不能改变数据库的连接,即是说一个ISessionFactory只能对应一个数据库连接。但NHibernate可以在同一个应用中实例化多个ISessionFactory。实例化多个ISessionFactory,并让类A或类B找到自己所对应的ISessionFactory,获取ISession,即可实现多数据库连接。

如何通过类型获取ISessionFactory呢?ISessionFactory的Statistics.EntityNames中保存了所有映射了的实体类的类名。我们可以判断实体类的类名是否在EntityNames中,确定实体类所对应的ISessionFactory。

根据类型获取ISessionFactory:

public interface ISessionFactoryHolder
{
    ISessionFactory GetSessionFactoryForEntity<TEntity>() where TEntity : IEntity;
}

 public class SessionFactoryHolder : ISessionFactoryHolder
{
    private IDictionary<string, int> entityDictionary;
    private IDictionary<int, ISessionFactory> factoryDictionary;

    public SessionFactoryHolder()
    {
        this.entityDictionary = new Dictionary<string, int>();
        this.factoryDictionary = new Dictionary<int, ISessionFactory>();
    }

    #region ISessionFactoryHolder Members

    public ISessionFactory GetSessionFactoryForEntity<TEntity>() where TEntity : IEntity
    {
        int hashCode = 0;

        Asserts.Assert<MappingException>(
            this.EntityInDictionary(typeof(TEntity).FullName, out hashCode) == false
            , string.Format("No persister for:{0}", typeof(TEntity).FullName));

        return this.factoryDictionary[hashCode];
    }

    #endregion

    public void RegisterSessionFactory(ISessionFactory sessionFactory)
    {
        Asserts.IsNotNull(sessionFactory, "sessionFactory");

        this.factoryDictionary[sessionFactory.GetHashCode()] = sessionFactory;

        this.MapingEntityNameToSessionFactoryHashCode(sessionFactory.Statistics.EntityNames
            , sessionFactory.GetHashCode());
    }

    private bool EntityInDictionary(string entityName, out int sessionFactoryHashCode)
    {
        return this.entityDictionary.TryGetValue(entityName, out sessionFactoryHashCode);
    }

    private void MapingEntityNameToSessionFactoryHashCode(string[] entityNames, int sessionFactoryHashCode)
    {
        foreach (var entityName in entityNames)
        {
            this.entityDictionary[entityName] = sessionFactoryHashCode;
        }
    }
}

根据类型获取ISession:

public interface ISessionHolder : IDisposable
{
    ISession GetSessionForEntity<TEntity>() where TEntity : IEntity;
}
 public class SessionHolder : ISessionHolder, IUnitOfWork
{
    private readonly ISessionFactoryHolder factoryHolder;
    private IDictionary<int, ISession> sessionDictionary;

    public SessionHolder(ISessionFactoryHolder factoryHolder)
    {
        Asserts.IsNotNull(factoryHolder, "factoryHolder");

        this.factoryHolder = factoryHolder;
        this.sessionDictionary = new Dictionary<int, ISession>();
    }

    #region ISessionHolder Members

    public ISession GetSessionForEntity<TEntity>() where TEntity : IEntity
    {
        if (this.sessionDictionary.ContainsKey(this.GetFactoryHashCode<TEntity>()) == false)
        {
            this.sessionDictionary[this.GetFactoryHashCode<TEntity>()] = this.OpenNewSession<TEntity>();
        }

        return this.sessionDictionary[this.GetFactoryHashCode<TEntity>()];
    }

    #endregion

    #region IDisposable Members
    //Dispose Code
     #endregion

    #region IUnitOfWork
    //IUnitOfWork
    #endregion

    private ISessionFactory GetFactory<TEntity>() where TEntity : IEntity
    {
        return this.factoryHolder.GetSessionFactoryForEntity<TEntity>();
    }

    private int GetFactoryHashCode<TEntity>() where TEntity : IEntity
    {
        return this.GetFactory<TEntity>().GetHashCode();
    }

    private ISession OpenNewSession<TEntity>() where TEntity : IEntity
    {
        return this.GetFactory<TEntity>().OpenSession();
    }
}

Repository:

public interface IRepository<TEntity> where TEntity : IEntity
{
    void Save(TEntity entity);
    //......
}

public class NHibernateRepository<TEntity> : IRepository<TEntity> where TEntity : IEntity
{
    private readonly ISessionHolder sessionHolder;

    public NHibernateRepository(ISessionHolder sessionHolder)
    {
        Asserts.IsNotNull(sessionHolder, "sessionHolder");

        this.sessionHolder = sessionHolder;
    }

    protected virtual ISession Session
    {
        get
        {
            return this.sessionHolder.GetSessionForEntity<TEntity>();
        }
    }

    public override void Save(TEntity entity)
    {
        this.Session.Save(entity);
    }
    //......
}
Storm代理
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto... 点击进入详情页
本回答由Storm代理提供
热裤
2016-08-21 · TA获得超过177个赞
知道小有建树答主
回答量:221
采纳率:50%
帮助的人:220万
展开全部
NHibernate本身不支持多数据库支持,需要写SessionFactory扩展,不过一些项目已经写了这个扩展,例如Burrow项目,使用多个hibernate.cfg.xml,创建多个SessionFactory。。这是必须的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式