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!
Idem à Groxx, mais pour une situation plus simple avec une clé non composite. – roufamatic