NHibernate:复合键多对一映射:Can';t解析属性(外键组件)

NHibernate:复合键多对一映射:Can';t解析属性(外键组件),nhibernate,mapping,composite-key,one-to-one,many-to-one,Nhibernate,Mapping,Composite Key,One To One,Many To One,我希望任何人都能帮忙。我必须针对第三方数据库进行开发,我被他们糟糕的设计卡住了。尽管如此,我还是想使用NHibernate,所以我必须跳出篮筐 简单地说,有一个“事件”表与“运输”表有一个关系。传输表有一个复合主键,由字段“ID”和“FK_EventID”组成,后者当然指回事件记录。每个事件都指向传输表中的一条不同记录,因此它实际上是一对一的关系。顺便说一句,这两个字段都是guid 为了解决这个问题,我创建了这些类(为了简单起见,省略了其他数据字段): 以及: 在映射文件中,我尝试这样做(请注意

我希望任何人都能帮忙。我必须针对第三方数据库进行开发,我被他们糟糕的设计卡住了。尽管如此,我还是想使用NHibernate,所以我必须跳出篮筐

简单地说,有一个“事件”表与“运输”表有一个关系。传输表有一个复合主键,由字段“ID”和“FK_EventID”组成,后者当然指回事件记录。每个事件都指向传输表中的一条不同记录,因此它实际上是一对一的关系。顺便说一句,这两个字段都是guid

为了解决这个问题,我创建了这些类(为了简单起见,省略了其他数据字段):

以及:

在映射文件中,我尝试这样做(请注意,我使用的是多对一):


以及:


当我尝试运行此操作时,会收到以下异常消息:

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>();
fcoEvents=session.CreateCriteria(typeof(FcoEvent))
.Add(Restrictions.Eq(“ID”,eventId))
.Add(Restrictions.Eq(“FK_TransportationID”,transportId))
.List();

我将进一步研究这个问题,但显然我需要用另一种方式来质疑这个问题

我真傻。我被一些错误的、过时的代码分散了注意力。关键是能够使用事件的主键检索事件,包括相关的传输子级,这很简单。此外,还可以使用复合主键检索传输问题,这可以通过以下代码实现

    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
               });
公共FCotTransportation GetTransportation(Guid transportId,Guid eventId) { F交通运输; ISession session=Factory.OpenSession(); ITransaction tx=会话.BeginTransaction(); 尝试 { transport=session.Get(新的FcoTransportation() { ID=传输ID, FK_EventID=EventID }); 所以这真的不是问题。我只是被整个复合外键的东西弄糊涂了。我希望我没有浪费人们的时间

   <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>
fcoEvents = session.CreateCriteria(typeof(FcoEvent))
                    .Add(Restrictions.Eq("ID", eventId))
                    .Add(Restrictions.Eq("FK_TransportationID", transportId))
                    .List<FcoEvent>();
    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
               });