2010-10-10 30 views
0

J'espère que n'importe qui peut vous aider. Je dois développer contre cette base de données de tiers et je suis coincé avec leur conception merdique. Cependant, je veux utiliser NHibernate, donc je vais devoir sauter dans des cerceaux. Simplifié, il y a cette table "Événement" qui a une relation avec une table "Transports". La table de transport a une clé primaire composée composée du champ "ID" et "FK_EventID", ce dernier renvoyant bien sûr à l'enregistrement d'événement. Chaque événement pointe vers un enregistrement distinct dans la table de transport, donc il s'agit vraiment d'une relation un-à-un. Les deux champs sont Guids BTW.NHibernate: Mappage plusieurs-à-clés de la clé composite: Impossible de résoudre la propriété (composant clé étrangère)

tente de cartographier ceci, voici comment j'ai créé les classes (en laissant d'autres champs de données pour des raisons de simplicité):

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

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

Et:

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

    public virtual Guid ID { get; set; } 

    public virtual Guid FK_EventID { get; set; } 

Dans les fichiers de mappage je suis tenter cette (note que je me sers beaucoup à un):

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

Et:

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

Lorsque je tente de lancer, je reçois le message d'exception suivant:

NHibernate.QueryException: ne pouvait pas résoudre la propriété: FK_TransportationID de: FcoLib.FcoEvent

Ma première intuition était que peut être une erreur d'orthographe dans le nom du champ, mais cela n'a pas été le cas. Alors maintenant je suis complètement perplexe et je ne sais pas comment procéder. Toute aide est grandement appréciée. Thnx.


Mise à jour

Je pense avoir trouvé la source de l'erreur. Je n'y avais pas encore regardé, car je supposais qu'il s'agissait d'une erreur de mappage, mais apparemment, il s'agit d'une erreur d'interrogation. Il arrive où je fais la requête:

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

J'Approfondir, mais évidemment je dois interroger ce d'une manière différente ...

Répondre

0

me Silly. J'ai été distrait par un code défectueux et obsolète. Le but était de pouvoir récupérer l'événement incluant l'enfant de transport associé en utilisant la clé primaire de l'événement et cela fonctionne simplement. En outre, il devrait être possible de récupérer le problème de transport avec la clé primaire composite et cela peut être accompli avec le code ci-dessous.

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

Donc, cela a été un non-problème vraiment. Je viens d'être confus par l'ensemble de la clé composite étrangère. J'espère que je n'ai pas perdu le temps des gens.