2010-12-15 56 views
0

Je rencontre des problèmes pour mapper un relation entre deux entités lorsqu'il y a deux colonnes impliquées dans le mappage.Nhibernate Relations de mappage sur plusieurs colonnes

Je modélise une machine d'état avec deux types d'objets - Etat et Transition. Chaque processus a sa propre machine d'état, donc les états et les transitions doivent être identifiés par ProcessId. Mes classes d'entités sont comme ceci:

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; } 
} 

J'ai besoin des propriétés de navigation (State.TransitionsIn, State.TransitionsOut, Transition.FromState, Transition.ToState) à se fonder sur la ProcessId et le nombre ordinal de l'Etat. Par exemple, Transition.FromState doit naviguer vers l'entité où t.ProcessId = s.ProcessId et t.FromStateNum = s.Ordinal.

J'ai essayé le mappage suivant, mais il se plaint que j'utilise deux colonnes pour mapper à un (StateId).

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"); 
    } 
} 

Comment puis-je faire en sorte que cela fonctionne?

Répondre

1

Que diriez-vous de cette cartographie .. Je ne l'ai pas testé mais juste en essayant de donner une direction.

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

J'ai résolu le problème d'une manière différente en utilisant une clé de substitution - probablement la bonne façon. Je n'ai pas eu l'occasion de tester ta réponse, mais je te donnerai des félicitations de toute façon. Merci. –

+0

Merci, je suis heureux que je pourrais aider en quelque sorte .. –