0

我希望任何人都可以提供帮助。我必须针对这个第三方数据库进行开发,我有点被他们蹩脚的设计所困扰。不过,我想使用 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

我的第一个预感是字段名称可能存在拼写错误,但这并不成立。所以现在我完全感到困惑,不知道如何进行。任何帮助是极大的赞赏。谢谢。


更新

我想我找到了错误的根源。我还没有看过那里,因为我认为这是一个映射错误,但显然它是一个查询错误。它发生在我进行查询的地方:

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

我会进一步研究这个,但显然我需要以不同的方式查询这个......

4

1 回答 1

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

所以这真的不是问题。我刚刚被整个复合外键的东西弄糊涂了。我希望我没有浪费人们的时间。

于 2010-10-10T10:21:02.353 回答