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.