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

所以这一直是一个非问题。我刚刚被整个复合外键所困惑。我希望我没有浪费人们的时间。