-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Probleme beim Speichern von vererbten Klassen mit NHibernate
PostPosted: Fri Aug 21, 2009 6:02 am 
Newbie

Joined: Fri Aug 21, 2009 5:14 am
Posts: 1
Hallo Zusammen wünsche euch einen schönen Tag.

Ich habe folgendes Problem:

In meiner Applikation habe ich die Klasse Client, Person, Teilnehmer.
Die Klasse Person erbt von der Klasse Client.
Die Klasse Teilnehmer erbt von der Klasse Person.

In der Applikation kann man Personen hinzufügen, ändern und löschen.
Man sollten nun auch eine bestehende Person zu einem Teilnehmer mutieren können.
Und einen Teilnehmer zurück zu einer Person.

Doch das Mutieren funktioniert nicht.
Wenn ich die Person zu einem Teilnehmer mutiere, sollte eigendlich in der Teilnehmer Tabelle einen Eintrag erstellt werden, mit der selben ID wie die von Person und Client.

Doch es wird eine neue Person + Client mit einer neuen ID erstellt und einen Teilnehmer mit der neuen ID.
Die Person wird also kopiert und der Teilnehmer der neuen Person hinzugefügt.

Wenn ich einen Teilnehmer zu einer Person mutieren möchte, bekomme ich diese Fehlermeldung:
Quote:
Object with id: was not of the specified subclass: DomainModel.Entities.AxendoPerson (class of the given object did not match class of persistent copy)


Nun zum Programm.

In der Datenbank habe ich für jede Klasse eine Tabelle.
Die Klassen werden per JoinedSubClass auf die Tabellen gemapt.

Code:
public class ClientMap : ClassMap<Client>
{
   public ClientMap()
   {
      LazyLoad();
      Id(x => x.Id);

      References(x => x.DefaultLanguage, "DefaultLanguage")
         .Cascade.None();

      HasMany<Communication>(x => x.CommunicationList)
         .Cascade
         .AllDeleteOrphan();

      HasMany<Adresse>(x => x.Adressen)
         .Cascade
         .AllDeleteOrphan();

      JoinedSubClass<Person>("Id", m =>
      {
         m.LazyLoad();
         m.WithTableName("tblPerson");
         m.Map(x => x.Vorname);
         m.Map(x => x.Name);
         m.References<StringTable>(x => x.Anrede, "Anrede")
            .Cascade.None();
         m.References<StringTable>(x => x.AnredeZusatz, "AnredeZusatz")
            .Cascade.None();
         m.JoinedSubClass<Teilnehmer>("Id", n =>
         {
            n.LazyLoad();
            n.WithTableName("tblTeilnehmer");
            n.Map(x => x.AHVNr_new);
            n.Map(x => x.AHVNr_old);
            n.Map(x => x.Geburtstag);
            n.Map(x => x.TN_Nummer);
            n.Map(x => x.Heimatort);
            n.References<StringTable>(x => x.Geschlecht, "Geschlecht")
               .Cascade.None();
            n.References<StringTable>(x => x.Zivilstand, "Zivilstand")
               .Cascade.None();
         });
      });
   }
}


Die Savemethode für Person/Teilnehmer sieht stark vereinfacht wie folgt aus:
Ach ja wir arbeiten mit ASP.Net MVC
Code:
public ActionResult SavePerson(string ViewName, string EntityType, string lang)
{

   object obj = null;

   switch (EntityType)
   {
      case "Person":
      {
         Person pers = new Person();
         //Object, Prefix
         UpdateModel(pers, "Person");
         obj = pers;
      }
      break;
      case "Teilnehmer":
      {
         Teilnehmer teil = new Teilnehmer();
         //Object, Prefix
         UpdateModel(teil, "Person");
         obj = teil;
      }
      break;
      default:
         break;
   }

   if(obj != null)
      Save(obj, "person.");
}


Jenachdem welcher Typ gespeicher werden muss, wird ein Person Objekt oder ein Teilnehmer Objekt erstellt.
Mit UpdateModel werden dann die Properties gesetzt.
Und zumschluss wird das Objekt gespeichert.

Die Savemethode für Objekte sieht wie folgt aus:
Es wird Merge verwendent.

Code:
public InvalidValue[] Save(object entity)
{
   var errors = Validate(entity);
      
   if (errors.Length == 0) {
      //NHibernateHelper.GetCurrentSession().SaveOrUpdate(entity);
      NHibernateHelper.GetCurrentSession().Merge(entity);
   }
   return errors;
}



Ich hoffe das mir jemand helfen kann.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.