Avatar billede tigertool Nybegynder
13. januar 2007 - 16:09 Der er 25 kommentarer og
1 løsning

NHibernate problemer

Hej,

Jeg har forsøgt at arbejde med NHibernate ved hjælp af Microsoft Visual C# 2005 Express Edition. Jeg har prøvet udfra flere forskellige tutorials jeg fandt via google - men intet er lykkes.

Er der nogen der enten kender en god tutorial, hvor ALT er forklaret, eller er der en der kan guide mig igennem hvordan jeg får det op og køre (evt. ved at sende mig et project :) )

Jeg har en PostGres-database til formålet.
tabel: persons (id, name, address)
Avatar billede arne_v Ekspert
13. januar 2007 - 16:17 #1
jeg har et "hello world" eksempel som jeg kan poste
Avatar billede tigertool Nybegynder
13. januar 2007 - 16:18 #2
Det ville være dejligt :)
Specielt hvis du kunne knytte et par kommentarer til hvor configurationsfilerne placeres osv.
Avatar billede arne_v Ekspert
13. januar 2007 - 16:19 #3
SQLServer (så du skal rette en lille smule)

opret tabel:

CREATE TABLE T1 (F1 INTEGER PRIMARY KEY, F2 VARCHAR(50))
GO
INSERT INTO T1 VALUES(1, 'A')
GO
INSERT INTO T1 VALUES(2, 'BB')
GO
INSERT INTO T1 VALUES(3, 'CCC')
GO
Avatar billede arne_v Ekspert
13. januar 2007 - 16:20 #4
min t1mapping.xml

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
    <class name="Test.Hibernate.T1, Test, Version=1.0.2100.41493, Culture=neutral, PublicKeyToken=null" table="T1">
        <id name="F1" column="F1">
            <generator class="assigned"/>
        </id>
        <property name="F2">
            <column name="F2"/>
        </property>
    </class>
</hibernate-mapping>

refererer til T1 klassen og jeg bruger en primær nøgle som jeg selv styrer
Avatar billede tigertool Nybegynder
13. januar 2007 - 16:20 #5
Done :)
Avatar billede arne_v Ekspert
13. januar 2007 - 16:21 #6
selve koden:

using System;
using System.Collections;

using NHibernate;
using NHibernate.Cfg;

using log4net.Config;

namespace Test.Hibernate
{
    public class T1
    {
        private int f1;
        private string f2;
        public int F1
        {
            get
            {
                return f1;
            }
            set
            {
                f1 = value;
            }
        }
        public string F2
        {
            get
            {
                return f2;
            }
            set
            {
                f2 = value;
            }
        }
    }
    public class TestClass
    {
        public static void SelectOne()
        {
            Configuration cfg = new Configuration();
            cfg.AddXmlFile("t1mapping.xml");
            ISessionFactory sf = cfg.BuildSessionFactory();
            ISession s = sf.OpenSession();
            T1 r = (T1)s.Load(typeof(T1), 2);
            Console.WriteLine(r.F1 + " " + r.F2);
            s.Close();
        }
        public static void SelectAll()
        {
            Configuration cfg = new Configuration();
            cfg.AddXmlFile("t1mapping.xml");
            ISessionFactory sf = cfg.BuildSessionFactory();
            ISession s = sf.OpenSession();
            IList all = s.Find("FROM T1 AS t1");
            for(int i = 0; i < all.Count; i++) {
                T1 r = (T1)all[i];
                Console.WriteLine(r.F1 + " " + r.F2);
            }
            s.Close();
        }
        public static void Main(string[] args)
        {
            XmlConfigurator.Configure();
            SelectOne(); 
            SelectAll();
        }
    }
}

bemærk at jeg loader t1mapping.xml manuelt
Avatar billede arne_v Ekspert
13. januar 2007 - 16:22 #7
og det aller vigtigste test.exe.config (som skal ligge i samme dir som test.exe)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="nhibernate" type="System.Configuration.NameValueSectionHandler,System,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    </configSections>
    <nhibernate>
        <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
        <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
        <add key="hibernate.connection.connection_string" value="Server=ARNEPC3;Integrated Security=SSPI;database=Test"/>
        <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect"/>
    </nhibernate>
    <log4net>
        <appender name="console" type="log4net.Appender.ConsoleAppender,log4net">
            <layout type="log4net.Layout.PatternLayout,log4net">
                <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
            </layout>
        </appender>
        <root>
            <priority value="DEBUG"/>
            <appender-ref ref="console" />
        </root>
        <logger name="NHibernate">
            <priority value="WARN"/>
        </logger>
    </log4net>
</configuration>

her defineres både NHibernate og log4net (som NHibernate bruger)

bl.a. skal database connection konfigureres her
Avatar billede arne_v Ekspert
13. januar 2007 - 16:23 #8
bemærk at NHibernate er et stort område - det her dækker en halv procent af
funcktionaliteten eller deromkring, men man skal jo starte et sted
Avatar billede tigertool Nybegynder
13. januar 2007 - 16:31 #9
Giver mig følgende:

2007-01-13 16:31:14,296 [1980] ERROR NHibernate.Cfg.Configuration - Could not co
mpile the mapping document
NHibernate.MappingException: persistent class Test.Hibernate.T1, Test, Version=1
.0.2100.41493, Culture=neutral, PublicKeyToken=null not found ---> System.TypeLo
adException: Could not load type 'Test.Hibernate.T1, Test, Version=1.0.2100.4149
3, Culture=neutral, PublicKeyToken=null', check that type and assembly names are
correct
  at NHibernate.Util.ReflectHelper.ClassForName(String name)
  at NHibernate.Cfg.Binder.ClassForFullNameChecked(String fullName, String erro
rMessage)
  --- End of inner exception stack trace ---
  at NHibernate.Cfg.Binder.ClassForFullNameChecked(String fullName, String erro
rMessage)
  at NHibernate.Cfg.Binder.BindClass(XmlNode node, PersistentClass model, Mappi
ngs mapping)
  at NHibernate.Cfg.Binder.BindRootClass(XmlNode node, RootClass model, Mapping
s mappings)
  at NHibernate.Cfg.Binder.BindRoot(XmlDocument doc, Mappings model)
  at NHibernate.Cfg.Configuration.AddValidatedDocument(XmlDocument doc)
2007-01-13 16:31:14,343 [1980] ERROR NHibernate.Cfg.Configuration - Could not co
nfigure datastore from file: t1mapping.xml
NHibernate.MappingException: persistent class Test.Hibernate.T1, Test, Version=1
.0.2100.41493, Culture=neutral, PublicKeyToken=null not found ---> System.TypeLo
adException: Could not load type 'Test.Hibernate.T1, Test, Version=1.0.2100.4149
3, Culture=neutral, PublicKeyToken=null', check that type and assembly names are
correct
  at NHibernate.Util.ReflectHelper.ClassForName(String name)
  at NHibernate.Cfg.Binder.ClassForFullNameChecked(String fullName, String erro
rMessage)
  --- End of inner exception stack trace ---
  at NHibernate.Cfg.Binder.ClassForFullNameChecked(String fullName, String erro
rMessage)
  at NHibernate.Cfg.Binder.BindClass(XmlNode node, PersistentClass model, Mappi
ngs mapping)
  at NHibernate.Cfg.Binder.BindRootClass(XmlNode node, RootClass model, Mapping
s mappings)
  at NHibernate.Cfg.Binder.BindRoot(XmlDocument doc, Mappings model)
  at NHibernate.Cfg.Configuration.AddValidatedDocument(XmlDocument doc)
  at NHibernate.Cfg.Configuration.AddXmlReader(XmlTextReader hbmReader)
  at NHibernate.Cfg.Configuration.AddXmlFile(String xmlFile)
Avatar billede tigertool Nybegynder
13. januar 2007 - 16:32 #10
filen t1mapping.xml findes i debug-output bib.
Avatar billede arne_v Ekspert
13. januar 2007 - 16:38 #11
test namespace på klassen og version
Avatar billede arne_v Ekspert
13. januar 2007 - 16:38 #12
version på assembly altså
Avatar billede tigertool Nybegynder
13. januar 2007 - 16:40 #13
version på NHibernate.dll ?
Avatar billede arne_v Ekspert
13. januar 2007 - 16:42 #14
nej den dll som indeholder T1 klassen (Test.dll i mit eksempel)
Avatar billede arne_v Ekspert
13. januar 2007 - 16:43 #15
<class name="Test.Hibernate.T1, Test, Version=1.0.2100.41493, Culture=neutral, PublicKeyToken=null" table="T1">

klassenavn med namespace
dll navn
dll version
-
-
tabel i databasen
Avatar billede tigertool Nybegynder
13. januar 2007 - 16:43 #16
Jeg har lagt det hele ind i en ConsoleApplication - også T1-klassen.
Avatar billede arne_v Ekspert
13. januar 2007 - 16:44 #17
jeg kan ikke huske om den version egentligt er nødvenig, men den er et mit eksempel
(det er lang tid siden at jeg lavede det så jeg kan ikke huske præcist hvorfor)
Avatar billede arne_v Ekspert
13. januar 2007 - 16:44 #18
erstat dll med "dll eller exe" i alt ovenfor
Avatar billede tigertool Nybegynder
13. januar 2007 - 16:53 #19
Ok. Jeg har nu denne linje i konfigurationen:
<class name="Test.Hibernate.T1, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="T1">

Hvilket giver mig en anden stacktrace, nemlig:

NHibernate.HibernateException: Could not create the driver from NHibernate.Drive
r.NpgsqlDriver. ---> System.Reflection.TargetInvocationException: Exception has
been thrown by the target of an invocation. ---> NHibernate.HibernateException:
The IDbCommand and IDbConnection implementation in the assembly Npgsql could not
be found.  Please ensure that the assembly Npgsql is in the Global Assembly Cac
he or in a location that NHibernate can use System.Type.GetType(string) to load
the types from.
  at NHibernate.Driver.ReflectionBasedDriver..ctor(String driverAssemblyName, S
tring connectionTypeName, String commandTypeName)
  at NHibernate.Driver.NpgsqlDriver..ctor()
  --- End of inner exception stack trace ---
  at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOn
ly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& b
NeedSecurityCheck)
  at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCach
e)
  at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisi
bilityChecks, Boolean fillCache)
  at System.Activator.CreateInstance(Type type, Boolean nonPublic)
  at System.Activator.CreateInstance(Type type)
  at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary setti
ngs)
  --- End of inner exception stack trace ---
  at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary setti
ngs)
  at NHibernate.Connection.ConnectionProvider.Configure(IDictionary settings)
  at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDic
tionary settings)
  at NHibernate.Cfg.SettingsFactory.BuildSettings(IDictionary properties)
  at NHibernate.Cfg.Configuration.BuildSettings()
  at NHibernate.Cfg.Configuration.BuildSessionFactory()
  at Test.Hibernate.TestClass.SelectOne() in C:\Documents and Settings\Administ
rator\My Documents\Visual Studio 2005\Projects\ConsoleApplication1\ConsoleApplic
ation1\Program.cs:line 44
  at Test.Hibernate.TestClass.Main(String[] args) in C:\Documents and Settings\
Administrator\My Documents\Visual Studio 2005\Projects\ConsoleApplication1\Conso
leApplication1\Program.cs:line 69
Avatar billede arne_v Ekspert
13. januar 2007 - 16:57 #20
prøv og smid  Npgsql.dll i samme dir som din EXE
Avatar billede tigertool Nybegynder
13. januar 2007 - 17:03 #21
Puha, ja det gav en laaang stacktrace
Avatar billede tigertool Nybegynder
13. januar 2007 - 17:06 #22
Så virker det :)

Jeg takker.

Husk at smid et svar.
Avatar billede tigertool Nybegynder
13. januar 2007 - 17:35 #23
hmmm...

interface NHibernate.ISession
The main runtime interface between a Java application and Hibernate. This is the central API class abstracting the notion of a persistence service.

Find en fejl ;)
Avatar billede arne_v Ekspert
13. januar 2007 - 19:34 #24
NHibernate er en .NET version af Hibernate til Java
Avatar billede arne_v Ekspert
13. januar 2007 - 19:34 #25
og et svar
Avatar billede tigertool Nybegynder
13. januar 2007 - 20:01 #26
Er jeg klar over ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester