7

问题来自Fluent NHibernate + 多个数据库(无需点击此链接,这里应该有足够的背景知识)。

我的问题是这样的:

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

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

例如:

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) 需要做什么?

谢谢阅读!

4

1 回答 1

4

我将从查看 ISessionFactory.GetClassMetaData 方法开始。

IClassMetadata metadata = sessionfactory.GetClassMetadata(boType); 

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

我从未使用过它,也没有手头的参考资料,但如果它无法识别类型,我希望它返回 null 或引发异常。如果您在没有错误的情况下获得元数据值,那么这就是您的会话工厂。

祝你好运

尼尔。

于 2010-04-23T13:04:31.477 回答