2010-01-05 12 views
1

J ai eu la configuration suivante:NHibernate Parent/relation enfant

public class ParentEntity 
{ 
    public ICollection<ChildEntity> {get; set; } 
} 

public class ChildEntity 
{ 
    // do i need to the parent here? 
} 

J'ai réussi à sauver le ParentEntity et CASCADE la sauvegarde des entités enfant ont été ajoutées qui ont été enregistrés aussi bien. Mais dans la table db, la référence ParentId de l'enfant a été définie pour autoriser NULL. Lorsque vous le définissez sur NOT NULL, les échecs d'enregistrement étant donné que l'ID Parent de la table enfant est NULL.

Que se passe-t-il ici? ;)

Lorsque

+1

1. Vous n'avez pas besoin du parent pour effectuer le mappage. Peut-être que vous en avez besoin pour autre chose? 2. Nous ne pouvons pas vous donner une réponse si vous ne dites pas comment vous faites le mappig – Paco

Répondre

1

Vous devez mapper les deux côtés de la relation normalement, et lorsque vous ajoutez un enfant à la collection du parent, vous devez également définir la propriété parent sur l'enfant. Normalement, vous réaliseriez en écrivant une méthode comme ceci:

public void AddChild(ChildEntity child) 
{ 
    this.Children.Add(child); 
    child.Parent = this; 
} 

NHibernate persiste la colonne ParentId dans la table des enfants en fonction de la propriété mappée dans la classe ChildEntity. La définition de la relation un-à-plusieurs permet simplement à NHibernate de charger la collection à partir de la base de données en fonction des valeurs de cette colonne

+3

Vous ne le faites pas normalement. Lorsque vous faites cela pour tout, presque toutes vos entités seront couplées les unes aux autres (code spaggetti lorsque l'application devient plus grande) et il ne sera pas possible d'utiliser le contexte borné. Certaines relations doivent être bidirectionnelles, en particulier lorsque le parent et l'enfant sont tous deux des racines agrégées, mais lorsque le parent est responsable de ses enfants, ce qui est la plupart du temps, une relation unidirectionnelle sera meilleure. – Paco

0

J'ai le même problème et j'ai besoin que nHibernate expose la colonne de clé étrangère, ou le faire en classe via la collection.

Problème: nHibernate crée l'objet de collection (IList, par exemple) et vous ne pouvez pas surcharger ou écouter les événements d'ajout de collections de base.

Cela devient un problème uniquement parce qu'il est requis par l'infrastructure de services RIA WCF.

Questions connexes