[C# NHibernate]Unknow entity class ClassLibrary1.Cat

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
Hallo allemaal,

Ik ben wat aan het spelen met NHibernate en probeer een example na te bouwen. Ik heb de volgende class:

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
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1 {
    public class Cat {
        private string id;
        private string name;
        private char sex;
        private float weight;

        public Cat() {
        }

        public virtual string Id {
            get { return id; }
            set { id = value; }
        }

        public virtual string Name {
            get { return name; }
            set { name = value; }
        }

        public virtual char Sex {
            get { return sex; }
            set { sex = value; }
        }

        public virtual float Weight {
            get { return weight; }
            set { weight = value; }
        }
    }
}


De xml die erbij hoort:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">

  <class name="ClassLibrary1.Cat, ClassLibrary1" table="Cat">

    <!-- A 32 hex character is our surrogate key. It's automatically
            generated by NHibernate with the UUID pattern. -->
    <id name="Id">
      <column name="CatId" not-null="true"/>
      <generator class="assigned" />
    </id>

    <!-- A cat has to have a name, but it shouldn' be too long. -->
    <property name="Name">
      <column name="Name" length="16" not-null="true" />
    </property>
    <property name="Sex" />
    <property name="Weight" />
  </class>

</hibernate-mapping>


En de code die ik probeer uit te voeren:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void button1_Click(object sender, EventArgs e) {
            Configuration config = new Configuration();
            ISessionFactory sessionFactory = config.Configure().BuildSessionFactory();
            config.AddAssembly("ClassLibrary1");
            ISession session = sessionFactory.OpenSession();

            ITransaction tx = session.BeginTransaction();

            Cat princess = new Cat();
            princess.Name = "Princess";
            princess.Sex = 'F';
            princess.Weight = 7.4f;

            session.Save(princess);
            tx.Commit();

            session.Close();
            sessionFactory.Close();
        }


Maar elke keer als ik probeer de session.save te doen dan zegt ie dus Unknow entity class Classlibrary1.Cat. Ik heb al gezocht op internet en wat dingen uitgeprobeerd zoals het goed zetten van de build action en dergelijke, maar het werkt nog steeds niet. Wie kan me hier bij helpen?

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Hm, 't enige wat ik me zo direct kan bedenken is toch dat je build action voor je mapping file niet goed staat.
Op wat heb je die build action gezet ?
Of hoe heb je uw mapping file precies genoemd ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
De mapping file heet Cat.hbm.xml en de build action staat op "Embedded resource" en de copy action op "Copy always"

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
Iemand anders nog een goed idee wat er aan de hand zou kunnen zijn?

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Ja ....
Waarom voeg je je assembly aan je config toe nadat je je SessionFactory gebouwd hebt ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • CHeff
  • Registratie: Oktober 2002
  • Laatst online: 26-08 19:51

CHeff

Allemaal gekkigheid

Ik heb even de documentatie er op nageslagen en daar staat de namespace al in de hibernate-mapping tag. Misschien dat je daar wat mee kan.

XML:
1
2
3
4
5
6
7
8
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="ClassLibrary1" assembly="ClassLibrary1">

    <class name="Cat" table="Cat">
        ...
    </class>

</hibernate-mapping>


Bron: Quickstart with IIS and Microsoft SQL Server - 1.3 Mapping the Cat ;)

Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
@whoami: Dat kwam ik ergens tegen op internet en had ik toegevoegd om te proberen. Het weghalen maakt niets uit, nog steeds dezelfde foutmelding.

@CHeff: Ik heb die aanpassing ook al gehad, en ook weer even terug gezet maar nog steeds dezelfde foutmelding.

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Tuurlijk mag je het niet weghalen; als je eens leest wat die AddAssembly doet, dan weet je dat je het niet mag weghalen.
Dat lijntje geeft nl. aan dat NHibernate in die assembly moet gaan zoeken naar hibernate mapping files.
Als je dat lijntje code weghaalt, dan heb je gewoon hetzelfde probleem: NHibernate gaat geen enkele assembly gaan doorzoeken naar mapping files etc...
Je moet je Assembly aan je config toevoegen voordat je je sessionfactory creeërt.

De fout die je krijgt, heeft nl. te maken met het feit dat NHibernate jouw class niet kan vinden, en dat zal te maken hebben met het feit dat je session factory al bestaat voor je aan hibernate zegt in welke assemblies hij moet gaan kijken waarin jouw classes staan. AFAIK gaat de session factory dat nl. gaan doen.

[ Voor 10% gewijzigd door whoami op 27-02-2008 10:10 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
He thnx, dat was inderdaad de fout. Ik heb de code als volgt aangepast:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            Configuration config = new Configuration();
            config.Configure();
            config.AddAssembly("ClassLibrary1");
            ISessionFactory sessionFactory = config.BuildSessionFactory();
            ISession session = sessionFactory.OpenSession();

            ITransaction tx = session.BeginTransaction();

            Cat princess = new Cat();
            princess.Name = "Princess";
            princess.Sex = 'F';
            princess.Weight = 7.4f;

            session.Save(princess);
            tx.Commit();

            session.Close();
            sessionFactory.Close();


Ik had hem er al een keer na de new Configuration() lijn geplaatst maar dat werkte niet omdat je dus eerst config.Configure() aan moet roepen en daarna de config.AddAssembly("ClassLibrary1");.

Bedankt voor jullie hulp!!

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Maar je weet nu wel waarom je die assembly daar moet toevoegen ?

Kijk ook eens hoe je in je config file kunt zeggen welke assemblies er door hibernate moeten doorzocht worden voor hbm.xml files.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
Nou niet helemaal precies, maar ik denk omdat je met config.Configure() aangeeft dat hij de configuratie moet lezen uit de app.config, vervolgens aangeeft waar hij moet zoeken voor de mappings (met de config.AddAssembly() ) en vervolgens de BuildSessionFactory aanroept waarin hij de mappings leest. En als je eerst de BuildSessionFactory aanroept, en dus geen mappings leest en vervolgens die entity aanmaakt weet hij niet hoe die gemapt moet worden.

Zoiets dnek ik.

Ik ben net bezig met NHibernate dus zal nog wel genoeg erover moeten lezen. In ieder geval bedankt voor jullie hulp.

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 10-09 15:33
Wat ik meestal doe is mijn hibernate config file als Embedded resource opnemen en daar de mapping references in opnemen, voorbeeld:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.0" >
    <session-factory name="NHibernate.Source">
        <property name="show_sql">false</property>
        <property name="dialect">App.MsSql2005Dialect, Algemeen</property>
        <property name="use_outer_join">true</property>
        <property name="max_fetch_depth">200</property>
        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
        <property name="connection.driver_class" >NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.provider" >NHibernate.Connection.DriverConnectionProvider</property>
        <mapping assembly="DatabaseObjects"   />
    </session-factory>
</hibernate-configuration>


In je code doe je het dan als volgt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
// Boven inzetten
using NHibernate;
using Configuration = NHibernate.Cfg.Configuration;

// Initialisatie
Configuration cfg = new Configuration();
Assembly currentAssembly = Assembly.GetAssembly(this.GetType());

// Hiervoor is het belangrijk dat je NHibernateConfig.xml als Embedded resource in je assembly is toegevoegd.
cfg.Configure(currentAssembly, "AssemblyName.NHibernateConfig.xml");
cfg.SetProperty("hibernate.connection.connection_string", ConfigurationManager.AppSettings["ConnectionString"]);
ISessionFactory factory = cfg.BuildSessionFactory();


Maar er zijn vele manieren, je kan bijv. ook de Hibernate configuratie volledig in je App/Web.config plaatsen.

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • CHeff
  • Registratie: Oktober 2002
  • Laatst online: 26-08 19:51

CHeff

Allemaal gekkigheid

pjonk schreef op woensdag 27 februari 2008 @ 12:13:
...
Maar er zijn vele manieren, je kan bijv. ook de Hibernate configuratie volledig in je App/Web.config plaatsen.
Of in de hibernate.cfg.xml als je geen webapplicatie aan het bouwen bent ;)

[ Voor 75% gewijzigd door CHeff op 27-02-2008 12:20 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
CHeff schreef op woensdag 27 februari 2008 @ 12:17:
[...]

Of in de hibernate.cfg.xml als je geen webapplicatie aan het bouwen bent ;)
in dat geval gebruik je de app.config ;)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:27
He thnx, daar ga ik ook eens naar kijken.

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • CHeff
  • Registratie: Oktober 2002
  • Laatst online: 26-08 19:51

CHeff

Allemaal gekkigheid

whoami schreef op woensdag 27 februari 2008 @ 12:22:
[...]

in dat geval gebruik je de app.config ;)
Dat werkt ni... huh, wel? Eheh, oops. :$

Ja, dan idd graag de app.config. Maar als je de NHibernate configuratie apart wilt houden, dan hibernate.cfg.xml gebruiken. Zoekt NHibernate automagisch naar :+
Pagina: 1