nhibernate mysql配置_NHibernate 连接多数据库怎么配置

在项目中使用NHibernate连接多个数据库,一个ISessionFactory对应一个数据库,通过ISessionFactoryHolder和SessionHolder实现不同实体类匹配不同的ISessionFactory,从而实现多数据库操作。通过类型获取ISessionFactory和ISession的方法详细解析。
摘要由CSDN通过智能技术生成

展开全部

在开发一些项目时,会使用到多个数据库e5a48de588b662616964757a686964616f31333361313338。例如类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() where TEntity : IEntity;

}

public class SessionFactoryHolder : ISessionFactoryHolder

{

private IDictionary entityDictionary;

private IDictionary factoryDictionary;

public SessionFactoryHolder()

{

this.entityDictionary = new Dictionary();

this.factoryDictionary = new Dictionary();

}

#region ISessionFactoryHolder Members

public ISessionFactory GetSessionFactoryForEntity() where TEntity : IEntity

{

int hashCode = 0;

Asserts.Assert(

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() where TEntity : IEntity;

}

public class SessionHolder : ISessionHolder, IUnitOfWork

{

private readonly ISessionFactoryHolder factoryHolder;

private IDictionary sessionDictionary;

public SessionHolder(ISessionFactoryHolder factoryHolder)

{

Asserts.IsNotNull(factoryHolder, "factoryHolder");

this.factoryHolder = factoryHolder;

this.sessionDictionary = new Dictionary();

}

#region ISessionHolder Members

public ISession GetSessionForEntity() where TEntity : IEntity

{

if (this.sessionDictionary.ContainsKey(this.GetFactoryHashCode()) == false)

{

this.sessionDictionary[this.GetFactoryHashCode()] = this.OpenNewSession();

}

return this.sessionDictionary[this.GetFactoryHashCode()];

}

#endregion

#region IDisposable Members

//Dispose Code

#endregion

#region IUnitOfWork

//IUnitOfWork

#endregion

private ISessionFactory GetFactory() where TEntity : IEntity

{

return this.factoryHolder.GetSessionFactoryForEntity();

}

private int GetFactoryHashCode() where TEntity : IEntity

{

return this.GetFactory().GetHashCode();

}

private ISession OpenNewSession() where TEntity : IEntity

{

return this.GetFactory().OpenSession();

}

}

Repository:public interface IRepository where TEntity : IEntity

{

void Save(TEntity entity);

//......

}

public class NHibernateRepository : IRepository 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();

}

}

public override void Save(TEntity entity)

{

this.Session.Save(entity);

}

//......

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值