2012-06-27 2 views
3

Je rencontre un problème en essayant d'obtenir une relation many-to-many pour enregistrer l'enregistrement de jointure dans NHibernate en utilisant Automapper dans Fluent NHibernate.Fluent NHibernate Plusieurs à ne pas enregistrer

Il ya beaucoup d'autres messages à ce sujet sur S.O mais jusqu'à présent, aucun d'entre eux ont résolu le problème, se demandant si je fais quelque chose de différent comment. J'ai la configuration de l'application pour mapper, et quand je crée manuellement l'enregistrement de jointure dans la base de données, je récupère les données, donc au niveau de la lecture, il mappe correctement, mais il ne va pas persister la relation.

Voici la correspondance pertinente. J'utilisais automapper avec les conventions par défaut, mais j'ai finalement essayé cela en me basant sur un autre post SO.

.Mappings(m => { 
         m.AutoMappings.Add(AutoMap.AssemblyOf<User>); 
         m.AutoMappings.Add(AutoMap.AssemblyOf<PostalCode>); 
         m.AutoMappings.Add(
           AutoMap.AssemblyOf<VPA>() 
            .Override<VPA>(v => 
             v.HasManyToMany(x => x.PostalCodes) 
              .Table("PostalCodesToVPAs") 
              .ParentKeyColumn("PostalCode_Id") 
              .ChildKeyColumn("VPA_Id") 
              .Cascade.SaveUpdate()) 
            .Override<PostalCode>(p => 
             p.HasManyToMany(x => x.VPAs) 
              .Table("PostalCodesToVPAs") 
              .ParentKeyColumn("VPA_Id") 
              .ChildKeyColumn("PostalCode_Id") 
              .Cascade.SaveUpdate().Inverse()) 
          ); 
        }) 

Mon enregistrement actuel ressemble à ceci. Cela peut être exagéré car j'économise explicitement le code postal et vpa mais j'ai beaucoup lu sur les personnes ayant des problèmes avec la ligne inverse dans la cartographie, donc je voulais essayer les deux. Ça n'a pas marché.

var postalCode = new PostalCode {Value ="90210", CreatedBy = 0, CreationDate = DateTime.Now, ModifiedBy = 0, ModifiedDate = DateTime.Now}; 
vpa.PostalCodes.Add(postalCode); 
postalCode.VPAs.Add(vpa); 
PostalCodeService.Save(postalCode); 
VPAService.Save(vpa); 

sous les couvertures les appels service.save font

return (int)Session.Save(obj); 

Quelqu'un at-il vu cela et savoir pourquoi il ne sauverait pas la jointure dossier?

Répondre

4

Compris la solution, voulait mettre à jour au cas où quelqu'un rencontrerait le même problème.

Vous devez placer l'appel de sauvegarde dans une transaction ou ne pas valider l'enregistrement de jointure. J'ai fini par modifier ce code de service pour lire

using (var tx = Session.BeginTransaction()) { 
    Session.Save(obj) 
    tx.commit(); 
    return obj.Id; 
} 
Questions connexes