2010-07-15 11 views
1

Il s'agit d'une nouvelle question, donc désolé à l'avance. J'utilise NHibernate couramment et j'obtiens un comportement étrange à ce sujet.Mettre à jour automatiquement les deux extrémités d'une relation un à plusieurs avec NHibernate

J'ai deux classes qui ressemblent à ce que (simplifié):

public class Group 
{ 
    public virtual int Id{get;protected set;} 
    public virtual String Name{get;set;} 
    public virtual List<Person> Persons {get; protected set;} 
} 

public class Person 
{ 
    public virtual int Id{get;protected set;} 
    public virtual String Name{get;set} 
    public virtual Group Group {get;set;} 
} 

Et les applications groupe:

Id(x=>x.Id) 
Map(x=>x.Name) 
HasMany(x=>x.Persons).Cascade.All.Inverse() 

Personne:

Id(x=>x.Id) 
Map(x=>x.Name) 
References(x=>x.Group) 

Maintenant, dans mon code Je veux déplacer une personne que j'ai à un autre groupe. Comme il est une relation, je pensais que je pourrais simplement faire

myPerson.Group = anotherGroup; 
_mySession.SaveOrUpdate(myPerson); 
_mySession.Flush() 

Si je fais cela, la base de données est mise à jour correctement, mais si je tente de regarder dans la liste des personnes de l'objet « anotherGroup » Je ne t voir l'objet "myPerson", qui est toujours dans la liste des personnes de l'ancien groupe. Donc, y a-t-il un moyen de dire à NH de recharger la liste, ou de la faire toujours mettre à jour?

La seule solution que j'ai trouvé est maintenant ceci:

myPerson.Group.Persons.Remove(myPerson); 
anotherGroup.Persons.Add(myPerson); 
myPerson.Group = anotherGroup; 
_mySession.Flush() 

Mais je trouve un peu sale ...

Toute idée sur ce que je fais mal? Merci!

Répondre

3

Utilisez des méthodes auxiliaires pour simplifier cela; le groupe que vous voulez quelque chose le long des lignes de:

RemovePerson(person) 
AddPerson(person) 

Vous trouverez peut-cet article utile pour obtenir des conseils supplémentaires: Strengthening your domain: Encapsulated collections.

+0

Eh bien, en fait, c'est ce que je fais maintenant Je ne les ai pas montrés ici pour simplifier, mais je pensais que NH ferait ce travail pour moi, n'est-ce pas? Merci pour le lien, très intéressant. – Gimly

+0

@Gimly - malheureusement, maintenir ces relations est votre responsabilité. – DanP

+0

Des indices sur pourquoi c'est le cas? Je pense que dans Linq2Sql ces relations étaient automatiques. Est-ce que les futures versions vont changer cela? – Gimly

2

@Gimly les relations dans L2S sont automatiques car elles utilisent des collections personnalisées (NHibernate fonctionne avec des interfaces standard et peut conserver une collection après l'avoir instanciée comme, par exemple, List). Il y avait, cependant, quelques discussions informelles sur la façon d'améliorer cela, mais rien sur le tronc, car il a une très faible priorité, étant donné la solution de contournement facile (la réponse ci-dessus)

+0

J'espérais que vous ou Fabio entreriez, merci pour la confirmation – DanP

+0

Merci pour la perspicacité, toujours intéressant de connaître les raisons derrière un choix comme ça. – Gimly

+0

De toute façon, ne prenez pas mes mots comme canoniques, je suis juste un utilisateur enthousiaste :-) –

Questions connexes