Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[NHibernate] Probleem met publishen en embedded resources

Pagina: 1
Acties:
  • 611 views sinds 30-01-2008
  • Reageer

  • Hobbles
  • Registratie: Augustus 2004
  • Laatst online: 20-11 22:25
Ik ben sinds enkele dagen bezig met het ontwikkelen van applicatie's die NHibernate gebruiken. Dit in combinatie met C#. Nu is mijn solution structuur als volgt:
  • BusinessProject
    • hibernate.cfg.xml (1)
    • DatabaseMapping.hbm.xml (2)
    • Data Access objecten
    • Business objecten
  • GUIProject
    • Alle schermen
Tijdens het ontwikkelen gaat dit allemaal goed, en werkt de applicatie gelijk het hoort. De bestanden 1 en 2 heb ik als Embedded resource gedefinieerd (zoals de manual van NHibernate aanraadt). Echter wanneer ik deze solution probeer te publishen, kopieert deze de xml bestanden blijkbaar niet mee. Wanneer ik de applicatie probeer te starten vanaf de gepublishte setup, dan loopt hij vast met de error: "problem parsing configuration : System.IO.FileNotFoundException: Could not find file 'C:\Documents and Settings\<username>\Local Settings\Apps\2.0\RD42W4YB.90K\XT8BN719.C8T\vehi..tion_e25c0327580d6337_0001.0000_89a5463bacf170af\hibernate.cfg.xml'."

Op Google heb ik al gezocht maar weet de juiste zoektermen niet om de gewenste informatie te verkrijgen. Ook de manual van NHibernate vertelt niets over het publishen. Oja, ik gebruik Visual Studio 2008.
Heeft er iemand een idee hoe ik deze embedded resource op de juiste manier mee kan publishen?

[ Voor 8% gewijzigd door Hobbles op 23-12-2007 14:28 ]

Everything is possible if you really want it.


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 06-11 13:54
De embedded resource wordt onderdeel van de dll. Dus het klopt dat ze niet als apart bestand op schijf komen te staan. NHibernate ondersteunt het uitlezen van de mapping uit een dll, dus daar hoef jij niets extra voor te doen (behalve aangeven in welke assembly de mapping staat).

Ik zou hibernate.cfg.xml niet als embedded resource meecompileren, maar als normaal bestand naar de output dir laten kopieren. Dan hoef je de applicatie niet opnieuw te compileren als je de connectionstring wijzigt.

  • Hobbles
  • Registratie: Augustus 2004
  • Laatst online: 20-11 22:25
Dus ik zou hibernate.cfg.xml's Build Action op None moeten zetten in plaats van Embedded Resource. Als ik dat doe krijg ik nog steeds dezelfde error die zegt dat hibernate.cfg.xml niet gevonden kan worden. Copy To Output Directory staat ingesteld op Copy always, maar wordt dit bestand ook nog steeds in de dll gekopieerd op deze manier?

Want ik zie het nog steeds niet in de publish folder verschijnen. Ik word een beetje zot van dit probleem, ik zie zelf totaal geen oplossing of oorzaak.

Everything is possible if you really want it.


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 20-11 21:40

Not Pingu

Dumbass ex machina

Laat dan eens de code zien waarin je je SessionFactory configureert? Het lijkt er meer op dat je de cfg op een verkeerde manier aan NHibernate voert en het probleem niet in resource embedding zit.

Certified smart block developer op de agile darkchain stack. PM voor info.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:07
Als je de build-action 'embedded resource' specifieert, dan veronderstel ik toch dat die xml bestanden gewoon mee in je binary komen ?
Dan vraag ik me af waarom hij een file gaat gaan zoeken.

https://fgheysels.github.io/


  • Hobbles
  • Registratie: Augustus 2004
  • Laatst online: 20-11 22:25
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Database
    {
        private static ISessionFactory factory;

        public static ISessionFactory getSessionFactory()
        {
            if (factory != null)
                return factory;

            factory = new Configuration().Configure().BuildSessionFactory();
            return factory;
        }
    }


Dat is de manier waarop ik de sessionfactory configureer. Ik specifieer zelf nergens specifiek dat ik een hibernate.cfg.xml gebruik, dat is iets dat NHibernate intern regelt lijkt me. Ik vraag me zelf ook af waarom die naar een specifieke file gaat zoeken terwijl het in de dll zou moeten zitten.

Ik snap er niets meer van...

Everything is possible if you really want it.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:07
Wat gebeurt er als je de NHibernate configuratie in je app.config opneemt ipv een aparte file ?

https://fgheysels.github.io/


  • Hobbles
  • Registratie: Augustus 2004
  • Laatst online: 20-11 22:25
Het rare is dat die de App.config alleen maar neemt als deze in het GUI project staat (daar gaat ie m zoeken). Echter krijg ik dan de volgende melding: "Unrecognized attribute 'xmlns'. Note that attribute names are case-sensitive." Hierover kreeg ik in de hibernate.cfg.xml geen melding. Iemand een idee?

Mijn App.config:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
      <section name="hibernate-configuration" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"  />
    </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="dialect">NHibernate.Dialect.MySQLDialect</property>
      <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.connection_string">Server=http://www.****.**; Database=*****; User ID=***; Password=****; CharSet=latin1;</property>
      <property name="hibernate.show_sql">true</property>

      <mapping assembly="ProjectBusiness" />
    </session-factory>
  </hibernate-configuration>
</configuration>


Update:
Wanneer ik deze configuratie dmv code doe, werkt het wel na publishen. Het database mapping bestand vind hij dus wel zonder problemen.

Code nu:
C#:
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
public class Database
    {
        private static ISessionFactory factory;

        public static ISessionFactory getSessionFactory()
        {
            if (factory != null)
                return factory;

            Configuration config;
            config = new Configuration();
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionProvider, 
                "NHibernate.Connection.DriverConnectionProvider");
            config.SetProperty(NHibernate.Cfg.Environment.Dialect, 
                "NHibernate.Dialect.MySQLDialect");
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionDriver, 
                "NHibernate.Driver.MySqlDataDriver");
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionString,
                "Server=http://www.****.**; Database=****; User ID=****; Password=****; CharSet=latin1");
            config.SetProperty(NHibernate.Cfg.Environment.ShowSql, "true");
            config.AddAssembly("ProjectBusiness");

            factory = config.BuildSessionFactory();
            return factory;
        }

[ Voor 94% gewijzigd door Hobbles op 24-12-2007 14:32 ]

Everything is possible if you really want it.


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 06-11 13:54
Dat komt omdat de xml in je app.config anders moet zijn dan in nhibernate.cfg.xml. Zie hier http://www.fincher.org/tips/Languages/NHibernate.shtml voor een voorbeeld.

  • Hobbles
  • Registratie: Augustus 2004
  • Laatst online: 20-11 22:25
Als ik de App.config zo instel gelijk het gezegd wordt op die website krijg ik deze foutmelding: <session-factory xmlns='urn:nhibernate-configuration-2.2'> element was not found in the configuration file.

Volgens mij is die website van een oudere versie van NHibernate...

Everything is possible if you really want it.

Pagina: 1