2009-07-13 4 views
1

J'ai trois classes qui posent un problème lorsque vous essayez d'ajouter un nouvel enfant.NHibernate et l'ajout de nouveaux éléments avec une collection composite à une collection enfant

Ils sont:

User { 
     List attributesGroup> 
} 

AttributesGroup { 
    attributesGroupId 
    value 
} 

AttributesGroupId { 
    attrName 
    userId 
} 

La cartographie est:

<class name="AlternativeUserAttributes" table="`AlternativeUserAttributes`" lazy="true"> 
    <composite-id name="Id" class="Data.Entities.AlternativeUserAttributesId"> 
     <key-property name="AttributeName" column="`attributeName`" type="string" /> 
     <key-many-to-one name="User" class="Entities.User" column="`userId`" /> 
    </composite-id> 
    <property name="AttributeValue" column="`attributeValue`" type="string" /> 
    <many-to-one name="User" column="`userId`" cascade="none" not-null="true" /> 
    </class> 

Je peux supprimer des éléments et SaveUpdate de classe de la classe utilisateur sans problème, mais lorsque je tente d'ajouter un élément à la collecte via:

AlternativeUserAttributes aua = new AlternativeUserAttributes(); 
      aua.Id = new AlternativeUserAttributesId(); 
      aua.Id.AttributeName = name; 
      aua.Id.User = curUser; 
      aua.AttributeValue = value; 
      aua.User = curUser; 

     curUser.AlternativeUserAttributes.Add(aua); 

Je reçois une erreur à propos du fait que le nombre de lignes était e Je pensais que je devais être 1 mais zéro, et lorsque j'essaie de sauvegarder seulement les attributs AlternateUserAttributes en utilisant Save, j'obtiens l'erreur suivante: L'index était hors de portée. Doit être non négatif et inférieur à la taille de la collection. Nom du paramètre: index

Les deux tentatives lancent un INSERT pour le nouvel élément, mais je continue d'obtenir ces erreurs. Y a-t-il quelqu'un qui peut aider?

+0

Si je définis la valeur non enregistrée, elle renvoie une erreur de: System.ArgumentOutOfRangeException: l'index était hors de portée. Doit être non négatif et inférieur à la taille de la collection. – monksy

Répondre

1

J'ai corrigé cela en définissant la valeur non sauvegardée à tout et en éliminant la bidirectionnalité.

1

Je vais avoir du mal à suivre (SO a tronqué votre message), mais l'utilisation d'un ID composite peut causer ce problème. Puisque le type d'ID est 'assigné', NHibernate n'a aucune idée de la manière de dire si l'objet est transitoire ou persistant.

https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/example-parentchild.html

Aller à l'article 17.4 pour plus d'informations.

Une solution consiste à utiliser un champ de version ou d'horodatage. J'ai fini par implémenter la classe de base qui suit la persistance et utilise un intercepteur.

J'ai posté le code ici: How to save a child with assigned id in nhibernate

Cela dit, si vous obtenez alors je suis INSERTs pas à 100% sûr que ce soit le même problème.

Questions connexes