NHibernate: составное сопоставление «многие к одному»: не удается разрешить свойство (компонент внешнего ключа) - PullRequest
0 голосов
/ 10 октября 2010

Я надеюсь, что любой может помочь. Я должен развиваться против этой сторонней базы данных, и я немного застрял с их дерьмовым дизайном. Тем не менее, я хочу использовать NHibernate, поэтому мне придется прыгать через обручи.

Упрощенно, есть эта таблица «Событие», которая имеет отношение к таблице «Транспорт». Транспортная таблица имеет составной первичный ключ, состоящий из полей «ID» и «FK_EventID», последний, конечно, ссылается на Event-запись. Каждое событие указывает на одну отдельную запись в транспортной таблице, так что это действительно взаимно-однозначное отношение. Оба поля являются 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_TransproductionID из: FcoLib.FcoEvent

Моей первой догадкой было, что в названии поля может быть орфографическая ошибка, но это не сработало. Так что теперь я полностью озадачен и не знаю, как поступить. Любая помощь очень ценится. Thnx.


Обновление

Я думаю, что нашел источник ошибки. Я еще не смотрел там, потому что предположил, что это была ошибка отображения, но, очевидно, это ошибка запроса. Это происходит, когда я делаю запрос:

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

Я посмотрю дальше, но, очевидно, мне нужно запросить это по-другому ...

1 Ответ

0 голосов
/ 10 октября 2010

Глупый я. Я был отвлечен каким-то неисправным, устаревшим кодом. Цель состояла в том, чтобы иметь возможность получить событие, включая связанный дочерний транспорт, используя первичный ключ события, и это просто работает. Также должна быть возможность извлечь проблему транспорта с помощью составного первичного ключа, и это можно сделать с помощью приведенного ниже кода.

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

Так что это действительно не проблема. Я только что был смущен целым составным внешним ключом. Я надеюсь, что я не тратил время людей.

...