2011-03-31 7 views
0

Des questions similaires ont été posées, mais je ne trouve pas de réponse, alors voilà. J'ai la relation suivante Fluent cartographié:Fluent NHibernate Cascade Delete Error

HasMany<UserFilter>(x => x.UserProjectFilters) 
      .KeyColumns.Add("UserProfileID") 
      .Cascade.All() 
      .AsSet() 
      .Inverse() 
      .Cache.ReadWrite(); 

Lorsque je tente de supprimer un parent (entité de filtre) cependant, la suppression ne CASCADE pas; Je vois l'exception: "L'instruction DELETE est en conflit avec la contrainte REFERENCE ...". Dans NH Profiler, je vois que l'instruction Delete est générée pour le parent, mais aucune n'est générée pour l'enfant. Je m'attendrais à ce que la suppression de tous les enfants soit exécutée avant le parent. Qu'est-ce que je fais mal?

est ici la fin de UserProfileFilter de la relation:

References<Filter>(x => x.Filter) 
      .Column("FilterID") 
      .LazyLoad() 
      .Cascade.SaveUpdate(); 

Merci! Andy

+1

Essayez de prendre la .Cascade.SaveUpdate() de retour dans la référence de l'enfant de filtrer et de voir ce que ça fait. Cela peut vous aider à résoudre vos problèmes si vous simplifiez vos relations. Si vous regardez le SQL est-il essayer de supprimer le parent (filtre) en premier? –

Répondre

1

Cela a fini par être un problème avec plusieurs clés étrangères sur la table des enfants, et la mauvaise clé était utilisée dans la cartographie . J'ai changé le code ci-dessus pour le suivant et cela a fonctionné très bien:

HasMany<UserFilter>(x => x.UserProjectFilters) 
      .KeyColumns.Add("FilterID") 
      .Cascade.All() 
      .AsSet() 
      .Inverse() 
      .Cache.ReadWrite(); 

Merci pour l'aide David!

Andy

1

Je pense que vous avez besoin Cascade.AllDeleteOrphan() que vous avez mis en place la relation comme Inverse()

+0

Merci pour la réponse rapide, mais malheureusement cela n'a pas fonctionné. Je vois une exception NH: "Une exception est survenue lors de l'exécution de requêtes batch" et il n'y a malheureusement pas d'exception. C'est la même exception que j'ai vu sauf avec AllDeleteOrphan, il n'y a pas d'InnerException indiquant une violation de clé étrangère. – Andy

+1

Cela semble une configuration étrange - je n'ai généralement pas les deux extrémités d'une relation M-to-1 en cascade. Avez-vous créé le schéma vous-même, ou NHibernate l'a-t-il fait? –

+0

Nous avons créé notre schéma manuellement. Si je supprime le Cascade.SaveOrUpdate sur le mappage de collection enfant, je vois toujours l'erreur: "L'instruction DELETE en conflit avec la contrainte REFERENCE ...". D'autres pensées? – Andy