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

[C#] NHibernate probleem

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

Verwijderd

Topicstarter
ik heb een probleem in een van me mapping files bij Nhibernate, ik zal eerst ff wat code posten

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
    public class Topic
    {
        private int id;
        private string subject;
        private Message startMessage;
        private IList<Message> messages;

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

        public virtual string Subject
        {
            get { return subject; }
            set { subject = value; }
        }

        public virtual Message StartMessage
        {
            get { return startMessage; }
            set { startMessage = value; }
        }

        public virtual IList<Message> Messages
        {
            get { return messages; }
            set { messages = value; }
        }
    }


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class Message
    {
        private int id;
        private string text;

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

        public virtual string Text
        {
            get { return text; }
            set { text = value; }
        }
    }


Database ziet er zo uit:

Topics:
- Id
- Subject
- StartMessageId

Messages:
- Id
- Text

Ik wil nu dat als ik via hibernate een topic opvraag via de topic de startmessage kunnen ophalen maar ik krijg de mapping file niet goed

dit is nu me mapping, maar dat werkt helaas niet
<one-to-one name="StartMessage" class="Domain.Entities.Message, Domain"/>

Ik krijg geen foutmelding, de Topic.StartMessage is gewoon altijd null

Met een many-to-one krijg ik het wel voor elkaar maar volgens mij is dat niet helemaal de bedoeling.
Weet iemand hoe ik dit kan oplossen?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
De relatie is many to one, omdat het de tegenhanger is van de relatie message - topic, die 1:n is.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Zijn DB model is echter niet 1:n maar 1:1; Zijn topic heeft (enigszins eigenaardig) slechts 1 foreign key naar message-id.

Tenzij dit expliciet de bedoeling is, denk ik dat je toch beter even je model herziet.

Heeft Hibernate niet de mogelijkheid om te loggen (dmv log4x ?)

ASSUME makes an ASS out of U and ME


  • EfBe
  • Registratie: Januari 2000
  • Niet online
H!GHGuY schreef op dinsdag 09 oktober 2007 @ 18:50:
Zijn DB model is echter niet 1:n maar 1:1; Zijn topic heeft (enigszins eigenaardig) slechts 1 foreign key naar message-id.
Ik weet niet hoe jij denkt dat 1:1 relaties moeten worden gemaakt, maar die relatie is alleen 1:1 indien er een unique constraint ligt OP de FK. Je kunt nu nl. meerdere topics naar dezelfde message laten wijzen :)

Dus kijkend naar zn model is het een m:1 relatie. Hij moet dus aangeven dat de FK uniek is (geen idee of nhibernate dat ondersteunt, lijkt me wel)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

EfBe schreef op dinsdag 09 oktober 2007 @ 19:19:
[...]

Ik weet niet hoe jij denkt dat 1:1 relaties moeten worden gemaakt, maar die relatie is alleen 1:1 indien er een unique constraint ligt OP de FK. Je kunt nu nl. meerdere topics naar dezelfde message laten wijzen :)

Dus kijkend naar zn model is het een m:1 relatie. Hij moet dus aangeven dat de FK uniek is (geen idee of nhibernate dat ondersteunt, lijkt me wel)
gegeven de common stupidity om ID als primary key te zetten neem ik aan dat dit hier ook het geval is.
Met de aanname dat de namen zowel in de DB als in objectstructuur hetzelfde item aanduiden zie ik:

DB:
-Topics:
-- Id
-- Subject
-- StartMessageId

-Messages:
-- Id
-- Text

Objecten:
-Topics:
-- Id
-- Subject
-- StartMessageId
-- Messages

-Message:
-- Id
-- Text

In zijn DB mis ik dus een mapping voor de messages, tenzij die als n:m gemodeleerd zijn in een koppeltabel.

wat ik op doelde was:
- wat maakt een first post zo speciaal om em apart bij te houden (en nee, ik design niet dagelijks fora)
- Hoe maak je de mapping voor de overige messages dan ?

ASSUME makes an ASS out of U and ME


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
H!GHGuY schreef op donderdag 11 oktober 2007 @ 18:48:
[...]


wat ik op doelde was:
- wat maakt een first post zo speciaal om em apart bij te houden (en nee, ik design niet dagelijks fora)
Indeed, zelfs als je de firstpost ook op de website zet bijv. (als nieuwsartikel) kun je altijd nog
topic#/post1 doen.. dus ehm tsja.. :P move naar SEA en dan een database formuliertje gaan tekenen met relaties e.d. :P

~ Mijn prog blog!


Verwijderd

Topicstarter
StartMessage is belangrijk omdat ik in de lijst met topics ook wil zien wie de poster is en de datum van wanneer het gepost is, dit kan nu dus met Topic.StartMessage.Poster.Name en Topic.StartMessage.PostDateTime

Met de many-to-one werkt het perfect, zelf d8 ik dat het een one-to-one relatie was maar het is idd toch echt een many-to-one

Thanks!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Verwijderd schreef op zondag 14 oktober 2007 @ 18:29:
StartMessage is belangrijk omdat ik in de lijst met topics ook wil zien wie de poster is en de datum van wanneer het gepost is, dit kan nu dus met Topic.StartMessage.Poster.Name en Topic.StartMessage.PostDateTime

Met de many-to-one werkt het perfect, zelf d8 ik dat het een one-to-one relatie was maar het is idd toch echt een many-to-one

Thanks!
Ah.. dus ipv het topic zelf een topicstarter en postdatetime te geven doe je dat door de eerste message op te halen..

clever, minder Mb''s in je database

Maarr: voor elk topic in een topic leest moet je dan een extra query doen om ook de firstpost op te halen en daar de poster en postdatetime op te halen.

Nu heb ik weinig koek gegeten van databaseoptimalizatie (daar licht absoluut mijn "specialisme" niet ) maar dit lijkt me meer werk voor de server dan die extra mb-tjes, helemaal als je een lange topiclijst heb.

toch? (I could be sooo wrong btw)

~ Mijn prog blog!


Verwijderd

Topicstarter
Dat klopt helemaal maar over de optimalisatie en performance maken we ons nog niet zo veel zorgen :)

Verwijderd

H!GHGuY schreef op donderdag 11 oktober 2007 @ 18:48:
gegeven de common stupidity om ID als primary key te zetten neem ik aan dat dit hier ook het geval is.
Hmm.. wat is daar vreemd aan? je moet wilt je primary key toch ook in je class hebben?

Wij moffelen die Id weg door elke class te extenden van een basisclass met een id. dus:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class HibernateObject
{
   private int id;
   public virtual int Id
        {
            get { return id; }
            set { id = value; }
        }

  // add virtual methods that can be used
  // or overridden by all HibernateObjects

}

public Topic : HibernateObject
{
   private string subject
   .....

}


Het voordeel is nog niet geheel duidelijk maar in ieder geval is elk object dat via NHibernate gepersist wordt naar de database extended van die base-classe... wellicht handig om toch wat overzicht zo te houden.
Pagina: 1