2009-04-03 6 views
0

vient de commencer avec NHIbernate et avoir une question, probablement un peu stupi! ;-) J'ai 2 tables, Email et Pièce jointe, un email peut avoir zéro ou plusieurs pièces jointes. donc je créé un fichier hbm comme ceci:récupérer PK de la table mappée avec NHibernate

<set name="Attachments" table="Attachments"> 
    <key column="EmailId" foreign-key="fk_Attachments_Emails"/> 
    <composite-element class="Foo.Emails.Attachment, Foo.Emails"> 
    <!-- PROBLEM HERE!!! --> 
    <property name="Id" column="Id" type="long" />   
    <!-- END PROBLEM --> 
    <property name="Name" column="Name" type="String" length="50"/> 
    <property name="Mime" column="MimeType" type="String" length="50"/>  
    <property name="Size" column="Size" type="long" /> 
    <property name="FilePath" column="FilePath" type="String" length="256"/> 
    <property name="Parsed" column="Parsed" type="Boolean" /> 
    </composite-element> 
</set> 

Comme je veux être en mesure de rechercher les pièces jointes b PK (la colonne Id dans l'ensemble) Je l'ai inclus, mais maintenant chaque fois que j'essaye d'enregistrer un email avec des pièces jointes, je reçois une erreur de la base de données comme Nhibernate essaye d'insérer une valeur dans le PK. Donc, ma question est, puis-je extraire le pk pour la table Attqachment mais arrêter Nhiberntate de l'écrire lors de l'insertion d'un email/pièce jointe? Dois-je échanger avec un autre conteneur comme ?? si c'est le cas, soyez plus doués pour donner l'exemple, car je me bats pour en trouver un que je comprends!

Merci pour votre aide!

Répondre

0

Je pense que vous voulez une relation bidirectionnelle. De cette façon, vous pouvez naviguer dans l'association des deux côtés. Cela inclut les clés générées ... Voici un exemple:

<class name="Order" table="ORDERHEADER" lazy="false" > 
<id name="OrderId" column="ORDERID" type="int"> 
    <generator class="sequence"> 
    <param name="sequence">"ORDERID_SEQ"</param> 
    </generator> 
</id> 
<property name="OrderType" column="ORDERTYPE" type="Int16"/> 
<bag name="OrderDetail" table="ORDERDETAIL" lazy="false" inverse="true"> 
    <key column="OrderId"/> 
    <one-to-many class="OrderDetail" /> 
</bag> 

<class name="OrderDetail" table="ORDERDETAIL" lazy="false"> 
<id name="OrderDetailId" column="ORDERDETAILID" type="int"> 
    <generator class="sequence"> 
    <param name="sequence">"ORDERDTLID_SEQ"</param> 
    </generator> 
</id> 
<property name="OrderId" column="ORDERID" type="Int32"/> 
<property name="ItemNumber" column="ITEMNUMBER" type="Int32"/> 
<property name="OrderQuantity" column="ORDERQUANTITY" type="Int32"/> 
<many-to-one name="Order" class="Order" column="OrderId" /> 

1

Peut-être un exemple plus pratique?Où vous avez une structure d'objet comme celui-ci:

Email
--EmailId
--EmailProperty1
--AttachmentCollection

Pièce jointe
--AttachmentId
--ParentEmail
--AttachmentProperty1

mappé à une structure de table comme ceci (pas comment je le nommerais, mais c'est par exemple):

email
--emailId int PK, l'identité
--emailProp1 varchar (50)

emailattachment
--attachmentId int PK, l'identité
--emailId int, FK pour envoyer la table
--attachmentProp1 varchar (50)

<hibernate-mapping> 
     <class name="Email" table="email"> 
      <id name="EmailId"> 
      <!-- this tells NHibernate to use DB to generate id --> 
      <generator class="native"/> 
      </id> 
      <property name="EmailProperty1" column="emailProp1"/> 
      <bag name="AttachmentCollection" lazy="true" inverse="true"> 
      <key column="emailId"/> 
      <one-to-many class="Foo.Emails.Attachment, Foo.Emails"/> 
      </bag> 
     </class> 
     <class name="Attachment" table="emailattachment"> 
      <id name="AttachmentId"> 
      <generator class="native"/> 
      </id> 
      <property="AttachmentProperty1" column="attachmentProp1"/> 
      <many-to-one name="ParentEmail" class="Foo.Emails.Email, Foo.Emails" lazy="proxy" column="emailId"> 
     </class> 
    </hibernate-mapping> 

Sur cette carte, vous obtiendrez la relation bidirectionnelle, et cette étiquette de générateur est dit ing nhibernate les objets avec une propriété Id null (vous pouvez également spécifier une autre valeur "unsaved-value"), puis vous insérez l'objet, sinon update. Devrait résoudre votre problème actuel. Quelques autres choses: examinez de près le type de conteneur que vous devez utiliser lors de la mise en correspondance (sac par rapport à l'ensemble par rapport à la liste). Il y a une excellente rédaction dans NHibernateFAQ de hibernatingrhino.

En outre, puisque vous êtes nouveau à NHibernate, je recommande très fortement le summer of nhibernate screencasts. Le meilleur outil que j'ai trouvé jusqu'ici pour apprendre.

Questions connexes