NCommon + Fluent NHibernate +多个数据库?

时间:2012-05-30 17:51:05

标签: nhibernate fluent-nhibernate ncommon

我正在尝试通过http://codeinsanity.com的指导将NCommon和NH连接到多个数据库(请参阅“配置NCommon以获得多个数据库支持”),并通过以下建议的流畅方法工作:

    var configuration = NCommon.Configure.Using(adapter).ConfigureState<DefaultStateConfiguration>();

    configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => _sessionFactories[0]).WithSessionFactory(() => _sessionFactories[1]));

这可以按预期工作,但正如您所见,sessionFactories是硬编码的。我真正想做的是这样的事情:

     foreach(ISessionFactory sessionFactory in _sessionFactories)
     {
          configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => sessionFactory));
     }

但这引发了以下异常:

无法注册组件NCommon.Data.NHibernate.NHUnitOfWorkFactory。已有一个具有该名称的组件。您想要修改现有组件吗?如果没有,请确保指定唯一名称。

我希望有一种正确的方法来连接n-SessionFactories而不用硬编码 - 但我只是没有看到解决方案。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为通过将SessionFactory片段委托给方法来实现这一点,如下所示:

    configuration.ConfigureData<NHConfiguration>(config => ConfigureSessionFactories(config));

    private void ConfigureSessionFactories(NHConfiguration configuration)
    {
        foreach (ISessionFactory sessionFactory in _sessionFactories)
        {
            configuration.WithSessionFactory(() => sessionFactory);
        }
    }

但是,这似乎只是一种解决方案。假设您有多个会话工厂,您可以使用它们进行查询,但只有最后添加的会话工厂才能访问数据库并返回结果。对其他会话工厂的查询永远不会到达实际数据库,并且将返回零实体。

我能够让这个工作的唯一方法是:

    configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => _sessionFactories[0]).WithSessionFactory(() => _sessionFactories[1]));

我宁愿不硬编码,但我更倾向于迭代n个会话工厂的循环......有没有人知道如何实现这个目标?

相关问题