多列上的Nhibernate映射关系

时间:2010-12-15 01:40:57

标签: fluent-nhibernate

当映射中涉及两列时,我在映射两个实体之间的relationaship时遇到问题。

我正在使用两种对象类型建模状态机 - 状态和转换。每个进程都有自己的状态机,因此需要通过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 个答案:

答案 0 :(得分:1)

这个映射怎么样..我没有测试它,只是试图给出一个方向。

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