Domanda

Spero che chiunque può aiutare. Devo sviluppare fino contro questo terzo database di terze parti e sono di tipo bloccato con il loro design scadente. Eppure, io voglio usare NHibernate così dovrò fare i salti mortali.

semplificata, c'è questo tavolo "Evento", che ha un rapporto un tavolo "Trasporti". La tabella di trasporto ha una chiave primaria composta composto dal campo "ID" e "FK_EventID", quest'ultimo ovviamente lascia agli eventi record. Ogni punti evento per un record distinto nella tabella trasporto, quindi è uno-a-uno rispetto davvero. Entrambi i campi sono GUID BTW.

Il tentativo di mappare questo fuori, questo è come ho creato le classi (lasciando fuori gli altri campi di dati per semplicità):

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

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

E

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

    public virtual Guid ID { get; set; }

    public virtual Guid FK_EventID { get; set; }

Nei file di mapping che sto cercando questo (nota che sto usando molti-a-uno):

   <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> 

E

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

Quando si tenta di eseguire questo, ottengo il seguente messaggio di eccezione:

NHibernate.QueryException: non ha potuto risolvere proprietà: FK_TransportationID di: FcoLib.FcoEvent

La mia prima impressione è stata che ci può essere un errore di ortografia nel nome del campo, ma che non era in possesso. Così ora sono completamente perplesso e non so come procedere. Qualsiasi aiuto è molto apprezzato. Thnx.


Aggiorna

Penso che ho trovato la fonte dell'errore. Non avevo ancora guardato lì, perché ho pensato che era un errore di mappatura, ma a quanto pare si tratta di un errore di interrogazione. Succede dove faccio la domanda:

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

io approfondire questo, ma ovviamente ho bisogno di interrogare questo in un modo diverso ...

È stato utile?

Soluzione

Sciocco me. Sono stato distratto da un po 'di codice obsoleto difettoso. Il punto è stato quello di essere in grado di recuperare l'evento ivi compreso il relativo bambino di trasporto utilizzando la chiave primaria della manifestazione e che funziona semplicemente. Inoltre dovrebbe essere possibile recuperare il problema del trasporto con la chiave primaria composito e che può essere realizzato con il codice di seguito.

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

Quindi, questo è stato un non-problema davvero. Sono appena stato confuso da tutta la roba chiave esterna composta. Spero che non ho perso tempo delle persone.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top