[NHibernate] Meerdere connection strings nodig

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Hallo,

Ik ben net bezig met Nhibernate icm Oracle.
Nu is onze applicatie opgezet dat deze meerdere Oracle schema's nodig heeft die aan users hangen.

Zo heb ik bijvoorbeeld:

schema1 (schema1.Table1, schema1.Table2) met user: A
schema2 (schema2.Table3, schema2.Table4) met user B

Nu wil ik via 1 Datalaag gebaseerd op NHibernate gaan werken.
Ik zou dus in mijn NHibernate config iets op willen nemen als:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="A">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.Oracle9Dialect</property>
    <property name ="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
    <property name="connection.connection_string">
     connstring 1
    </property>
    <property name="show_sql">
      true
    </property>
  </session-factory>
 <session-factory name="B">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.Oracle9Dialect</property>
    <property name ="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
    <property name="connection.connection_string">
     connstring 2
    </property>
    <property name="show_sql">
      true
    </property>
  </session-factory>
</hibernate-configuration>


Kan dit (waarom zou anders het attribute property "name" op de sessionfactory node bestaan?)
En zo ja hoe kan ik dan bij deze sessionfacotries? Er bestaat niet zoiets als GetSessionFactoryByName();

Ik kan echt niet veel vinden over dit soort oplossingen icm met NHibernate.
Ik hoop dat iemand mij verder kan helpen.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wij gebruiken per connection gewoon 1 config file. We hebben een klein framework om NHibernate heen, en door middel van een Custom ConfigurationSection maken we alle benodigde session factories aan met verschillende configuration files.

Het is een dun laagje om NHibernate heen, maar in die laag hebben we ook allerlei utility code opgenomen die we i.c.m. NHibernate gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Het probleem is dat mijn DAO laag een classlib is die geen config file heeft. Hij zal uiteindelijk wel in een applicatie met een configurationfile geinclude gaan worden maar ik wil mijn DAO los opzetten onafhankelijk van de toekomstige applicatie die hem gaat gebruiken.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ja bij ons is de applicatie die gebruik maakt van de DAO verantwoordelijk om in zijn configuratie file een ConfigurationSection op te nemen.
Er staat dan in de application.config iets dergelijks
XML:
1
2
3
4
5
6
7
8
<configSections>  
  <section name="nhibernateSettings" type="..SectionHandler, ..." />
</configSections>
<nhibernateSettings>
  <sessionFactories defaultSessionFactory="MyDB">
    <add name="MyDB" factoryConfigPath="MyDB.NHibernate.config"/>
  </sessionFactories>
</nhibernateSettings>

Voor de rest staat het grote deel van de configuratie gewoon in MyDB.NHibernate.config. Je zult toch ergens aan moeten geven welke NHibernate.Config je wilt gebruiken, de application.config vind ik dan wel een nette plek

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

C#:
1
2
3
4
5
6
7
8
public static class ConfigurationExtension
{
   public static ISessionFactory BuildSessionFactory(this Configuration cfg, string name)
   {
       cfg.Properties[NHibernate.Cfg.Environment.SessionFactoryName] = name;
       return cfg.BuildSessionFactory();
   }
}


In je applicatie kun je dit dan gebruiken als:
C#:
1
2
3
4
5
6
7
8
9
10
public void Save(User user)
{
   ISessionFactory factory = new Configuration().BuildSessionFactory("B");
   using(ISession s = factory.OpenSession())
   using(ITransaction tx = s.BeginTransaction(IsolationLevel.ReadCommited))
   {
       s.Save(user);
       tx.Commit();
   }
}


Lekker simpel toch?

[ Voor 5% gewijzigd door Niemand_Anders op 04-03-2009 13:35 ]

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
waar heb je dit gevonden, ik kon het namelijk niet terug vinden in de documentatie...

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

4of9 schreef op woensdag 04 maart 2009 @ 14:25:
waar heb je dit gevonden, ik kon het namelijk niet terug vinden in de documentatie...
Het is ook niet gedocumenteerd (voor zover ik weet), maar omdat ik het ooit ook een keer nodig had voor een database migratie project hebben wij uren de code van Nhibernate doorploegt. Het doorzoeken van de code was een noodzaak geworden omdat we eigenlijk al 3 weken bezig waren en we ineens vast kwamen omdat we niet de juiste session factory terug kregen. Omdat wij altijd gebruiken maken een IoC framework (Windsor Containers destijds) was alles interfaces based. De class krijgt 'gewoon' tijdens de build-up een ISessionFactory toegewezen (ook tijdens de unittests) dus liepen wij eigenlijk pas tegen het einde van het project (als alle modules aan elkaar worden gehangen) ineens tegen een groot probleem aan. Wij hadden immers de aanname gedaan dat als je een configuratie sectie een naam kunt geven, dat je deze dan ook 'ergens' in de code kunt meegeven.

Bij NHibernate zijn ze nog (druk) bezig om de 1.2 documentatie te updaten naar 2.x. Omdat daarnaast weinig projecten meerdere databases gebruiken heeft documentatie daarom trend weinig prioriteit.

Later heb ik ook op diverse fora het gebruik van 'new Configuration().Configure("./b.config")' regelmatig zien terug komen waarom elke session factory zijn eigen .config bestand krijgt. Meestal werd dan door middel van dependency injection de juiste session factories aan de repositories meegegeven.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Niemand_Anders schreef op woensdag 04 maart 2009 @ 15:55:
[...]
Later heb ik ook op diverse fora het gebruik van 'new Configuration().Configure("./b.config")' regelmatig zien terug komen waarom elke session factory zijn eigen .config bestand krijgt. Meestal werd dan door middel van dependency injection de juiste session factories aan de repositories meegegeven.
Wij doen het inderdaad op een dergelijk manier, was inderdaad in de documentatie die andere manier ook nog niet tegen gekomen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Ik heb het nu ook middels een eigen config per sessionFactory en een custom configsection opgelost. Die had ik al eerder gevonden, maar door dat attribuut "name" ging ik er ook vanuit dat het standaard was dat je sessionFactories by Name op kon halen.

Dank je voor de reply's

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...

Pagina: 1