Связи Nhibernate Mapping на нескольких столбцах - PullRequest
1 голос
/ 15 декабря 2010

У меня проблемы с отображением отношения между двумя сущностями, когда в отображении участвуют два столбца.

Я моделирую конечный автомат с двумя типами объектов - State и Transition.Каждый процесс имеет свой собственный конечный автомат, поэтому ProcessId должен идентифицировать состояния и переходы.Мои классы сущностей выглядят так:

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

Мне нужно, чтобы навигационные свойства (State.TransitionsIn, State.TransitionsOut, Transition.FromState, Transition.ToState) основывались на ProcessId и порядковом номерегосударство.Например, Transition.FromState должен перейти к объекту, где t.ProcessId = s.ProcessId и t.FromStateNum = s.Ordinal.

Я пробовал следующее сопоставление, но он жалуется, что я используюдва столбца для сопоставления одному (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");
    }
}

Как мне заставить это работать?

1 Ответ

1 голос
/ 15 декабря 2010

Как насчет этого отображения? Я не проверял его, а просто пытался указать направление.

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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...