2008-11-21 17 views
2

Version Hibernate: 2.0.1GANHibernate - création d'enregistrements dans des tables connexes

J'essaie d'ajouter un enregistrement unique dans deux tables. Les tables sont liées. J'ai les connaissances de débutant sur NHiberate et j'espère qu'il y aura une meilleure façon de faire. À l'heure actuelle, je suis convaincu que la seule façon d'obtenir l'ID d'un enregistrement nouvellement ajouté est d'effectuer un SaveOrUpdate; puis le champ ID de l'objet est défini (puisque j'utilise l'auto-incrémentation avec SQL Server 2005 Express).

Pour ajouter un enregistrement dans une table liée, je dois définir le champ ID de son parent. Voici ce que je fais maintenant:

transaction = session.BeginTransaction(); 

Contact myContact = new Contact(); 

myContact.Company = "ABC Company"; 
myContact.Notes = "test"; 

session.SaveOrUpdate(myContact); 

Address myAddress = new Address(); 
myAddress.IdContact = myContact.Id; 
myAddress.City = "Any City"; 
myAddress.State = "XX"; 
myAddress.Zip = "12345"; 

session.SaveOrUpdate(myContact); 

// Commit transaction 
transaction.Commit(); 

Notez que l'adresse est lié à un contact. 1 CONTACT PAR NOMBREUX ADRESSES. Pour ajouter l'enregistrement ADDRESS, je dois avoir l'ID CONTACT correspondant et je crois que je ne peux l'obtenir qu'après avoir créé l'enregistrement CONTACT, d'où mon utilisation de "SaveOrUpdate" deux fois.

Une meilleure façon de procéder?

Merci!

+0

veuillez formater votre échantillon de code correctement. Si vous placez quatre espaces au début de la ligne, il est formaté en tant que bloc de code –

Répondre

3

Il y a un moyen beaucoup plus facile.

D'abord, ajoutez l'objet d'adresse à votre objet Contact

public class Contact 
{ 
    public Contact(){} 
    private IList<Address> _addresses; 
    public IList<Address> Addresses 
    { 
      get 
      { 
       if(_addresses == null) _addresses = new List<Address>(); 
       return _addresses 
      } 
      set 
      { 
       _addresses = value; 
      } 
    } 

Ensuite, dans votre carte fichier de mappage de la propriété Adresse à la table d'adresses dans votre base de données.

Quelque chose comme ceci dans votre fichier de mappage pour Contact:

<bag name="Addresses" cascade="all-delete-orphan" lazy="false"> 
    <key column="Address_FK" /> 
    <one-to-many class="DomainModel.Address, DomainModel" /> 
</bag> 

Réglez ensuite la propriété en cascade de la classe de contact à:

default-cascade="save-update" 

Maintenant, lorsque vous remplissez l'objet Adresse en contact, et enregistrez l'objet Contact, la collection d'objets Address persistera automagiquement.

Je peux faire des exemples plus complets si nécessaire.

Questions connexes