Ich habe Probleme beim Zuordnen einer Beziehung zwischen zwei Entitäten, wenn zwei Spalten im Mapping beteiligt sind.Nhibernate Mapping-Beziehungen in mehreren Spalten
Ich modelliere eine Zustandsmaschine mit zwei Objekttypen - State und Transition. Jeder Prozess verfügt über eine eigene Statusmaschine, sodass Status und Übergänge von ProcessId identifiziert werden müssen. Meine Entitätsklassen sind wie folgt aus:
public class State
{
public virtual long Id { get; set; }
public virtual int ProcessId { get; set; }
public virtual int Ordinal { get; set; }
public virtual Process Process { get; set; }
public virtual ICollection<Transition> TransitionsIn { get; set; }
public virtual ICollection<Transition> TransitionsOut { get; set; }
}
public class Transition
{
public virtual long Id { get; set; }
public virtual long ProcessId { get; set; }
public virtual int FromStateNum { get; set; }
public virtual int ToStateNum { get; set; }
public virtual long StateActionId { get; set; }
public virtual Process Process { get; set; }
public virtual StateAction StateAction { get; set; }
public virtual State FromState { get; set; }
public virtual State ToState { get; set; }
}
Ich brauche die Navigationseigenschaften (State.TransitionsIn, State.TransitionsOut, Transition.FromState, Transition.ToState) auf der ProcessId und der Ordnungszahl des Staates beruhen. Zum Beispiel sollte Transition.FromState zu der Entität navigieren, in der t.ProcessId = s.ProcessId und t.FromStateNum = s.Ordinal ist.
Ich habe die folgende Abbildung versucht, aber es beschwert sich, dass ich zwei Spalten bin mit einem (StateID) abzubilden.
public class StateMap : ClassMap<State>
{
public StateMap()
{
Id(x => x.Id);
HasMany(s => s.TransitionsIn)
.KeyColumns.Add("ProcessId", "ToStateNum")
.Inverse();
HasMany(s => s.TransitionsOut)
.KeyColumns.Add("ProcessId", "FromStateNum")
.Inverse();
}
}
public class TransitionMap : ClassMap<Transition>
{
public TransitionMap()
{
Id(x => x.Id);
References(t => t.FromState)
.Columns("ProcessId", "Ordinal");
References(t => t.ToState)
.Columns("ProcessId", "Ordinal");
}
}
Wie kann ich das zum Funktionieren bringen?
Ich habe das Problem mit einem Ersatzschlüssel gelöst - wahrscheinlich der richtige Weg. Ich hatte keine Gelegenheit, deine Antwort zu testen, aber ich gebe dir trotzdem die Anerkennung. Vielen Dank. –
Danke, froh, dass ich irgendwie helfen konnte .. –