1

J'ai deux objets qui ont une relation ManyToMany entre eux grâce à une table de mappage. Cependant, lorsque j'essaie de l'enregistrer, j'obtiens une exception de dépassement de pile. Ce qui suit est le code pour les applications:NHibernate ManyToMany Relation en cascade AllDeleteOrphan StackOverflowException

//EventMapping.cs 
HasManyToMany(x => x.Performers).Table("EventPerformer").Inverse().Cascade.AllDeleteOrphan().LazyLoad().ParentKeyColumn("EventId").ChildKeyColumn("PerformerId"); 


//PerformerMapping.cs 
HasManyToMany<Event>(x => x.Events).Table("EventPerformer").Inverse().Cascade.AllDeleteOrphan().LazyLoad().ParentKeyColumn("PerformerId").ChildKeyColumn("EventId"); 

Quand je change les performermapping.cs à Cascade.None() je me débarrasser de l'exception mais mon objet événement n'a pas l'interprète, je lui associons .

//In a unit test, paraphrased 
event.Performers.Add(performer); //Event 
eventRepository.Save<Event>(event); 
eventResult = eventRepository.GetById<Event>(event.id); //Event 
eventResult.Performers[0]; //is null, should have performer in it 

Comment dois-je écrire correctement? Merci

Répondre

3

Vous déclarez les deux côtés de la relation comme Inverse, ce qui signifie que personne n'est responsable de l'enregistrement de la relation et, bien sûr, ne fonctionnera pas.

Étant donné que vous ajoutez des événements à des interprètes, supprimez l'appel inverse de PerformerMapping.

Aussi, à moins que vous Flush la session puis Evict l'événement, un appel à session.Get en utilisant la même session retournera le même objet.

+1

Conserver également la sauvegarde des entités dans la transaction. – Sly

Questions connexes