我正在尝试通过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而不用硬编码 - 但我只是没有看到解决方案。有什么建议吗?
答案 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个会话工厂的循环......有没有人知道如何实现这个目标?