2010-10-10 81 views
0

我希望任何人都可以提供幫助。我必須針對這個第三方數據庫進行開發,而且我的設計很糟糕。不過,我想使用NHibernate,所以我將不得不跳過箍筋。NHibernate:複合鍵多對一映射:無法解析屬性(外鍵組件)

簡化後,有一個與「運輸」表有關係的「事件」表。運輸表具有由字段「ID」和「FK_EventID」組成的主鍵,後者當然指回到事件記錄。每個事件都指向運輸表中的一個不同記錄,所以它確實是一對一的關係。這兩個字段都是Guids BTW。

嘗試映射了這一點,這是我創建的類(而沒有考慮其他的數據字段爲簡單起見):

public class FcoEvent : IFcoObject 
    { 
     public virtual Guid ID { get; set; } 

     //public virtual Guid FK_TransportationID { get; set; } //ignore 
     public virtual FcoTransportation Transportation { get; set; } 

和:

[Serializable] 
public class FcoTransportation : IFcoObject 
{ 
    #region Members 

    public virtual Guid ID { get; set; } 

    public virtual Guid FK_EventID { get; set; } 

在映射文件我在嘗試此(請注意,我用的多對一個):

<class name="FcoLib.FcoEvent, FcoLib" table="FCO_Event"> 
    <id name="ID" column="ID"> 
     <generator class="guid" /> 
    </id> 
    <many-to-one name="Transportation" not-found="ignore" cascade="save-update" 
       class="FcoLib.FcoTransportation, FcoLib"> 
    <column name="FK_TransportationID" /> 
    <column name="ID" /> 
    </many-to-one> 

和:

<class name="FcoLib.FcoTransportation, FcoLib" table="FCO_Transportation"> 
    <composite-id> 
     <key-property name="ID" /> 
     <key-property name="FK_EventID" /> 
    </composite-id> 

當我嘗試運行此,我得到下面的異常消息:

NHibernate.QueryException:無法解析屬性:FK_TransportationID的:FcoLib.FcoEvent

我的第一直覺是,有可能是字段名稱中的拼寫錯誤,但這並不成立。所以現在我完全困惑,不知道如何繼續。任何幫助是極大的讚賞。日Thnx。


更新

我想我找到了錯誤的根源。我還沒有看過,因爲我認爲這是一個映射錯誤,但顯然這是一個查詢錯誤。它發生在那裏我做了查詢:

fcoEvents = session.CreateCriteria(typeof(FcoEvent)) 
        .Add(Restrictions.Eq("ID", eventId)) 
        .Add(Restrictions.Eq("FK_TransportationID", transportId)) 
        .List<FcoEvent>(); 

我將進一步研究這個,但顯然我需要以不同的方式來查詢這個...

回答

0

愚蠢的我。我被一些錯誤的,過時的代碼分心了。關鍵是能夠使用事件的主鍵檢索包括相關運輸孩子的事件,並且該工作簡單地起作用。另外,應該可以使用複合主鍵檢索傳輸問題,並且可以使用下面的代碼來完成。

public FcoTransportation GetTransportation(Guid transportId, Guid eventId) 
    { 
     FcoTransportation transport; 

     ISession session = Factory.OpenSession(); 
     ITransaction tx = session.BeginTransaction(); 
     try 
     { 
      transport = session.Get<FcoTransportation>(new FcoTransportation() 
       { 
        ID = transportId, 
        FK_EventID = eventId 
       }); 

所以這一直是一個非問題。我剛剛被整個複合外鍵所困惑。我希望我沒有浪費人們的時間。