如何使用Fluent NHibernate和多个数据库识别特定实体的会话工厂

时间:2010-04-23 12:39:06

标签: c# fluent-nhibernate multiple-databases

来自Fluent NHibernate + multiple databases的问题(无需关注此链接,此处应该有足够的背景信息)。

我的问题是:

我正在使用Fluent NHibernate。我的应用使用多个数据库。每个数据库都有自己的实体注册(映射)它。结果是有多个会话工厂,每个工厂与单个数据库相关,每个工作流都“包含”自己的一组映射实体。

对于加载实体,我创建了一个通用的Factory类,它提供了一些可用于任何注册实体(在任何数据库中)的标准加载方法。问题是:加载方法需要为我正忙着处理的实体类使用正确的会话工厂。我如何确定需要使用哪个会话工厂?我手头有所有的Session Factories(并且由数据库名称索引),我只需要一种方法,只知道我要加载的实体的类型,选择正确的Session Factory来使用。

例如:

public IBaseBusinessObject CreatePopulatedInstance(Type boType, Guid instanceKey)
{
  IBaseBusinessObject result = null;
  ISessionFactory sessionFactory = GetSessionFactory(boType);
  using (ISession session = sessionFactory.OpenSession())
  {
    using (session.BeginTransaction())
    {
      result = (IBaseBusinessObject)session.Get(boType, instanceKey);
    }
  }
  return result;
}

GetSessionFactory(boType)需要做些什么?

感谢阅读!

1 个答案:

答案 0 :(得分:4)

我首先看一下ISessionFactory.GetClassMetaData方法。

IClassMetadata metadata = sessionfactory.GetClassMetadata(boType); 

如果您可以维护ISessionFactory实例的列表,则可以枚举它们,直到找到包含boType类型元数据的实例。

我从来没有使用它并且没有我的引用,但我希望它返回null或者如果它不能识别类型则引发异常。如果您在没有错误的情况下获得元数据的值,那么这就是您的会话工厂。

祝你好运

尼尔。