2009-02-26 7 views
4

J'ai 2 entités Personne et adresse, Personne a une adresse.NHibernate: La colonne n'autorise pas les valeurs nulles. INSERT échoue

EDIT: L'adresse existe déjà, je veux simplement sauvegarder la clé étrangère.

Quand je fais cela:

PersonDTO person = new PersonDTO(); 
    person.Age = "Bob"; 
    person.Address = new AddressDTO {Key = 123}; 
    Save(person); 

Je reçois cette exception:

Impossible d'insérer la valeur NULL dans la colonne 'clé', table 'Adresse'; La colonne n'autorise pas les valeurs NULL. INSERT échoue. L'instruction a été interrompue.

fragment de fichier de mappage de personne

<class name="PersonDTO" table="Person" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Key" column="PersonKey" type="Guid"> 
     <generator class="guid" /> 
    </id> 
    <one-to-one name="Address" class="AddressDTOl" /> 
    </class> 

Je ne comprends pas pourquoi cela se produit, im donnant une valeur Adresse clé. Est-ce que mon approche est défectueuse?

+0

Inclure les correspondances NHibernate et des déclarations de classe. –

Répondre

0

Fixé!

J'ai changé ma cartographie nhibernate fluent, j'ai utilisé une relation de références au lieu de HasOne.

Cela a donné lieu à la modification du mappage à ceci:

<many-to-one name="Address" column="AddressKey" /> 
0

Vous devez enregistrer l'adresse avant d'enregistrer la personne. Selon le générateur, vous devrez peut-être utiliser la surcharge de sauvegarde transmise dans l'ID.

Si vous souhaitez que la sauvegarde soit implicite, vous devez définir la propriété de cascade d'adresse dans la personne.

+0

Désolé je n'étais pas clair l'adresse existe déjà, je veux juste enregistrer le lien de la personne à une adresse. – Dan

+0

Avez-vous obtenu l'adresse avec la même session que vous utilisez pour faire l'enregistrement? Sinon, vous devez joindre l'adresse à la session d'enregistrement. –

+0

? Je ne reçois pas l'adresse, dans l'exemple ci-dessus, j'instancie une nouvelle adresse avec une clé connue. Je l'ai également commuté pour qu'il obtienne l'objet address complet de la même session mais j'obtiens la même erreur. – Dan

2

Vous devez faire

AddressDTO add = new AddressDTO {Key = 123}; 
Save(add); 

PersonDTO person = new PersonDTO(); 
person.Age = "Bob"; 
person.Address = add; 
Save(person); 

Ou modifier votre carte si vous ne voulez pas enregistrer explicitement Adresse:

<many-to-one name="Address" column="..." class="AddressDTO" cascade="save-update" /> 

Si l'adresse existe déjà, vous devez obtenir de base de données:

PersonDTO person = new PersonDTO(); 
person.Age = "Bob"; 
person.Address = GetAddressDTO(123); 
Save(person); 
+0

Désolé je n'étais pas clair l'adresse existe déjà, je veux juste enregistrer le lien de la personne à une adresse – Dan

Questions connexes