2010-12-15 123 views
0

當映射涉及兩列時,我在映射兩個實體間的關係數據時遇到問題。多列上的Nhibernate映射關係

我使用兩種對象類型 - 狀態和轉換爲狀態機建模。每個進程都有自己的狀態機,因此需要通過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)是基於進程ID和狀態的序號。例如,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

這個貼圖怎麼樣..我沒有測試它,只是試圖給出一個方向。

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

我已經使用代理鍵以不同的方式解決了問題 - 可能是正確的方法。我沒有機會測試你的答案,但我仍然會爲你頒發榮譽。謝謝。 – 2010-12-16 01:21:43

+0

謝謝,很高興我能以某種方式幫助.. – 2010-12-16 02:14:24