2010-03-10 11 views
0

Mon haricot ressemble à ceci:NHibernate: Violée contrainte non nulle lors de l'enregistrement relation hasMany avec Cascade = AllDeleteOrphan

public class A { 
    ... 
    [HasMany (MapType = typeof(B), Table = "B_table", ColumnKey = "A_object_id", 
       Fetch = FetchEnum.Join, 
       RelationType = RelationType.List, Index = "id", 
       Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)] 

    IList<B> BList { get; set; } 
    ... 
} 

et quand effectuer sur Enregistrer ce haricot Je pense que les haricots de type B seront automatiquement sauvés (et supprimé à la mise à jour) aussi. NHibernate essaie sûrement cela, mais il le fait avec B_table.A_object_id défini sur NULL en premier, puis NHibernate met à jour B_table en définissant la valeur B_table.A_object_id appropriée (c'est-à-dire: A.ID).
Ce n'est pas ce que je veux, car j'ai une contrainte NOT NULL dans la base de données.
Ma question est: comment faire NHibernate enregistrer automatiquement les objets enfants avec le bon jeu d'ID depuis le début? Je sais que je peux créer un bean, le sauvegarder, obtenir son nouvel identifiant, créer des beans B, définir leur A_object_id et ensuite enregistrer des beans B ... mais c'est une solution de contournement.

Répondre

0

Les relations unidirectionnelles (dans lesquelles seul le parent connaît l'enfant) entraînent toujours une mise à jour pour définir l'ID. Je ne sais pas pourquoi et ça n'a pas beaucoup de sens pour moi non plus, mais c'est comme ça que fonctionne NHibernate.

Vous devez créer une relation bidirectionnelle où le hasMany aurait une inverse = true et B aurait une référence à la classe A (ce qui devrait être remplie lorsque vous ajoutez B à la collection.

+0

En fait, Je ne peux pas faire cela La classe B ne peut pas avoir une référence à A, car le mappage n'est pas si simple La classe B dans son B_table.A_object_id peut également référencer un objet de la table A2_table. classe A2 qui est objet de HasMany B. J'ai une condition CHECK appropriée dans la base de données pour valider une telle relation.Dans la perspective de la classe B, je n'ai pas besoin de savoir à quoi elle appartient – wysek

+0

Puis la seule autre option que je connaisse (après un peu de recherche) est d'enlever la contrainte nulle. –

+0

avez-vous résolu votre problème? Je me bats avec quelque chose de similaire à :( – frabiacca