2009-10-09 5 views
4

Je vais essayer de garder cette lacune, mais j'espère ne pas manquer aucune information importante dans mes problèmes. Le code que je crois fournit tous les détails, mais j'ai omis le bruit (c'est VB, donc il y a beaucoup de bruit :)).association clé-plusieurs-à-une et clé-propriété: nhibernate ne supprimera pas les éléments du jeu

objet A "Case" a beaucoup de "missions":

Public Class Case 
    Property CaseId As Guid 
    Property Assignments As ISet(Of CaseAssignment) 
End Class 

Public Class CaseAssignment 
    Property Case As Case 
    Property RoleId As Guid 
End Class 

Le modèle de données que j'ai remis des regards au sujet comme ce que vous attendez, sauf CaseAssignment est une clé composite:

table Case 
    CaseId uniqueid not null primary key 
    ... 

table CaseAssignment 
    CaseId uniqueid not null 
    RoleId uniqueid not null 
    PK := (CaseId, RoleId) 
    FK from CaseId -> Case.CaseId 

Enfin, les Fluent NHibernate Mappages:

Class CaseMapping 
    Public Sub New() 
    Table("Case") 
    KeyColumn("CaseId") 
    HasMany(Function(x) x.Assignments).KeyColumn("CaseId").Cascade.AllDeleteOrphan() 
End Class 

Class CaseAssignmentMapping 
    Public Sub New() 
    Table("CaseAssignment") 
    CompositeId() _ 
     .KeyReference(Function(x) x.Case, "CaseId") _ 
     .KeyProperty(Function(x) x.RoleId) 
End Class 

KeyReference est en corrélation avec « -many-to-clé un "dans le jargon de la cartographie XML.

Lorsque j'ajoute des affectations à un cas, tout est bon, mais lorsque je supprime des références, j'ai deux problèmes. Avec ce code:

aCase.Assignments.Remove(someAssignment) 
caseRepository.Save(aCase) 

L'erreur que je reviens est, « Impossible de supprimer les lignes de collecte ... Impossible d'insérer la valeur NULL dans la colonne « CASEID », table « CaseAssignments »; colonne ne permet pas nulls UPDATE. Echec La déclaration a été terminée. " Cela a été d'essayer de donner l'instruction SQL suivante:

UPDATE CaseAssignments SET CaseId = null 
WHERE CaseId = @p0 AND RoleId = @p1 AND CaseId = @p2 
@p0=[valid guid #1], 
@p1=[valid guid #2], 
@p2=[valid guid #1 again] **!?!** 

Donc, c'est un peu foiré. J'essaie donc de ce code:

aCase.Assignments.Remove(someAssignment) 
someAssignment.Case = Nothing 
caseRepository.Save(aCase) 

et l'erreur est "nombre inattendu de la ligne: 0; attendu: 1" parce NHibernate essayé de: SUPPRIMER DE CaseAssignments OU RoleId = [guid valide] ET CASEID = NULL

J'ai parcouru les threads et les forums ainsi que les docs NHibernate et Hibernate et je n'ai pas vraiment vu quelque chose de similaire. J'espère que c'est quelque chose de simple. Merci à tous ceux qui prennent une photo sur celui-ci!

Répondre

9

J'ai eu le même problème il y a quelques jours. La solution consiste à mettre l'attribut "inverse" à "true" sur votre collection de CaseAssignments dans votre classe CaseMapping. Comme ceci:

HasMany(Function(x) x.Assignments).KeyColumn("CaseId").Cascade.AllDeleteOrphan().Inverse() 

Pour autant que je sache, vous devez avoir à la fois le type de cascade AllDeleteOrphan et la propriété inverse définie sur true pour que cela fonctionne.

J'espère que cela fonctionne!

+0

Idem à Groxx, mais pour une situation plus simple avec une clé non composite. – roufamatic

Questions connexes