2010-12-15 3 views
0

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?

Antwort

1

Wie wäre es mit diesem Mapping .. Ich habe es nicht getestet, sondern nur versucht, eine Richtung zu geben.

public class StateMap : ClassMap<State> 
{ 
    public StateMap() 
    { 
     Id(x => x.Id); 
     HasMany(s => s.TransitionsIn) 
      .KeyColumn("ProcessId") 
      .KeyColumn("ToStateNum").PropertyRef("Ordinal") 
      .Inverse(); 

     HasMany(s => s.TransitionsOut) 
      .KeyColumn("ProcessId") 
      .KeyColumn("FromStateNum").PropertyRef("Ordinal") 
      .Inverse(); 
    } 
} 

public class TransitionMap : ClassMap<Transition> 
{ 
    public TransitionMap() 
    { 
     Id(x => x.Id); 
     References(t => t.FromState) 
      .Columns("ProcessId", "FromStateNum"); 
     References(t => t.ToState) 
      .Columns("ProcessId", "ToStateNum"); 
    } 
} 
+0

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. –

+0

Danke, froh, dass ich irgendwie helfen konnte .. –