NHibernate: Composite chiave molti-a-uno mappatura: Can not resolve (componente chiave esterna)
-
29-09-2019 - |
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 ...
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.