2010-11-15 16 views
0

Je carte élément dans mon mapping -NHibernate: ne peut pas ajouter des éléments à la carte élément

 <component name="Resources"> 
     <map name="Inner" table="SomeTable" lazy="false" fetch="join" access="field.lowercase-underscore"> 
      <key column="Id"/> 
      <index column="IndexId" type="String"/> 
      <composite-element class="SomeResource"> 
       <property name="Name"/> 
      </composite-element> 
     </map> 
     </component> 

Je veux ajouter des éléments dans la SomeTable de la manière suivante -

  var ent = new Entity(); 
     ent.Resources.Add("key1", new SomeResource()); 

     var saved = Session.SaveOrUpdate(ent); 
     Session.Session.Flush(); 
     Session.Session.Clear(); 

     var newEntity = new Entity {Id = saved.Id}; 
     ent.Resources.Add("key2", new SomeResource()); 

     Session.SaveOrUpdate(newEntity); // here nHib generates DELETE FROM SomeTable WHERE Id = saved.Id 
     Session.Session.Flush(); 
     Session.Session.Clear(); 

Je veux avoir elements "key1" & "key2" dans le SomeTable après l'exécution, comment cela peut-il être fait? .. Actuellement, nHib supprime tous les éléments avec l'ID spécifié de la SomeTable avant la deuxième sauvegarde.

Répondre

1

Avec ce code vous créez deux éléments avec le même identifiant, c'est-à-dire une clé primaire: c'est pourquoi NHibernate supprime l'élément "key1" (l'objet ent). Lorsque vous créez newEntity, n'assignez pas la propriété Id (comme vous le faites avec ent) si vous voulez un objet complètement nouveau. Sinon, si vous voulez mettre à jour un objet existant, vous faites:

var ent = new Entity(); 
    ent.Resources.Add("key1", new SomeResource()); 

    var saved = Session.SaveOrUpdate(ent); 
    Session.Session.Flush(); 
    Session.Session.Clear(); 

    // later... 

    var entToUpdate = Session.Get<Entity>(saved.Id); 
    ent.Resources.Add("key2", new SomeResource()); 

    Session.SaveOrUpdate(entToUpdate); 
    Session.Session.Flush(); 
    Session.Session.Clear(); 
+0

Merci pour votre réponse. Le problème est que je ne veux pas une entité complètement nouvelle, je veux juste ajouter un nouvel élément à une collection de carte interne de l'entité existante. – Dmitry

+0

alors pourquoi créez-vous une nouvelle entité? vous venez d'ajouter le nouvel élément à l'objet "ent". – Simone

+0

Eh bien, je ne peux pas). J'ai simplifié beaucoup l'exemple ci-dessus, dans mon application je n'ai pas d'objet "ent" .. – Dmitry