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?
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. –
Merci, je suis heureux que je pourrais aider en quelque sorte .. –