2010-09-22 11 views
0

Je suis nouveau à nhibernate alors peut-être la réponse dépend de mon manque de connaissances.Fluent NHibernate hasmany save insert valeur null

J'ai créé ces deux tables: alt text

(désolé pour la langue italienne, j'espère que vous pouvez comprendre withouth des problèmes).

, j'ai ces objets dans mon modèle:


[Serializable] 
public class Profilo 
{ 
    public virtual int Id { get; set; } 
    public virtual string Matricola { get; set; } 
    public virtual string Ruolo { get; set; } 
    public virtual IList ListaSedi { get; set; } 

    public Profilo() 
    { 
     ListaSedi = new List(); 
    } 
} 

[Serializable] 
public class Sede 
{ 
    public virtual string CodiceSede { get; set; } 
    public virtual string DescrizioneSede { get; set; } 
    public virtual Profilo Profilo { get; set; } 
} 

Ceci est la façon dont je cartographié les entités utilisant NHibernate couramment:


    public class Map_Sede : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Sede() 
     { 
      Table("TBA_Sede"); 

      Id(x => x.CodiceSede).Column("codice_sede").GeneratedBy.Assigned(); 

      Map(x => x.DescrizioneSede) 
       .Column("descrizione"); 


      References(prof => prof.Profilo) 
       .Column("codice_sede"); 

     } 

    } 


    public class Map_Profilo : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Profilo() 
     { 
      Table("TBA_Profilo"); 

      Id(x => x.Id).Column("id").GeneratedBy.Identity(); 

      Map(x => x.Matricola) 
       .Column("matricola"); 

      Map(x => x.Ruolo) 
       .Column("ruolo"); 

      HasMany(x => x.ListaSedi) 
       .AsBag() 
       .KeyColumns.Add("codice_sede") 
       .Not.LazyLoad() 
       .Cascade.None(); 

     } 
    } 

Maintenant, je voudrais insérer une nouvelle Profilo exemple sur mon. Tout semble fonctionner mais nhibernate n'insère pas de valeurs dans la colonne TBA_Profilo.codice_sede. J'ai remarqué que l'instruction insert est composée de deux paramètres (matricola, ruolo) - pourquoi oublie-t-il le troisième paramètre? J'ai lu quelque part (sur la liste de diffusion nhibernate) que c'est tout à fait normal, car il faut d'abord insérer des valeurs avec null, puis mettre à jour les mêmes enregistrements avec les bonnes valeurs contenues dans la propriété list.

Est-ce vrai? Est-ce que je fais des erreurs?

J'espère avoir clarifié la situation. gars thx

ps: J'utilise NHibernate 2.1 et Fluent NHibernate 1.1

MISE À JOUR: Voici le code que j'utilise pour sauver entité.


       var sesionFactory = NHibernateHelper.createSessionFactory(); 

       using (NHibernate.ISession session = sesionFactory.OpenSession()) 
       { 
        using (var transaction = session.BeginTransaction()) 
        { 
         try 
         { 
          session.SaveOrUpdate(entity); 
          transaction.Commit(); 
          session.Flush(); 
         } 
         catch (Exception) 
         { 
          transaction.Rollback(); 
          throw; 
         } 
         finally 
         { 
          transaction.Dispose(); 
         } 
        } 
       } 

MISE À JOUR 2: Après réponse rusée i légèrement modifié ma solution. Ce sont des nouvelles entités du modèle:



[Serializable] 
public class Profilo 
{ 
    public virtual int Id { get; set; } 
    public virtual string Matricola { get; set; } 
    public virtual string Ruolo { get; set; } 
    public virtual IList ListaSedi { get; set; } 

    public Profilo() 
    { 
     ListaSedi = new List(); 
    } 
} 

[Serializable] 
public class Sede 
{ 
    public virtual string CodiceSede { get; set; } 
    public virtual string DescrizioneSede { get; set; } 
    public virtual IList ProfiliAssociati { get; set; } 
} 

Et de nouvelles applications:


public class Map_Sede : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Sede() 
     { 
      Table("TBA_Sede"); 

      Id(x => x.CodiceSede).Column("codice_sede").GeneratedBy.Assigned(); 

      Map(x => x.DescrizioneSede) 
       .Column("descrizione"); 


      HasMany(x => x.ProfiliAssociati) 
       .AsBag() 
       .KeyColumns.Add("codice_sede") 
       .Cascade.All(); 


     } 

    } 


    public class Map_Profilo : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Profilo() 
     { 
      Table("TBA_Profilo"); 

      Id(x => x.Id).Column("id").GeneratedBy.Identity(); 

      Map(x => x.Matricola) 
       .Column("matricola"); 

      Map(x => x.Ruolo) 
       .Column("ruolo"); 

      HasMany(x => x.ListaSedi) 
       .AsBag() 
       .Inverse() 
       .KeyColumns.Add("codice_sede") 
       .Cascade.SaveUpdate(); 

     } 
    } 

Maintenant, il semble tout à fait au travail: je veux dire que NHibernate peut écrire colonne TBA_Profilo.codice_sede même si elle ne cicle sur Profilo .IList (insère le dernier élément de cette liste).

Des idées?

Répondre

1

Le mappage KeyColumns est appliqué uniquement à la table enfant dans une connexion plusieurs-à-un.

Si vous souhaitez établir une connexion, vous devez utiliser la colonne Id du tableau TBA_portfolio et la référencer à partir de TBA_Sede.

Quelque chose comme ceci:

Tba_portfolio Id | matricola | ruolo

Tba_sede Id | PorfolioId | descrizione

+0

J'ai essayé mais cela ne fonctionne pas :( – frabiacca

+0

En outre, j'ai édité mon poste en écrivant la méthode que j'utilise pour enregistrer les entités – frabiacca

+0

mise à jour réponse – Sly

0

Votre application est erroné, essayez ceci:

public class Map_Profilo : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Profilo() 
     { 
      Table("TBA_Profilo"); 

      Id(x => x.Id).Column("id").GeneratedBy.Identity(); 

      Map(x => x.Matricola) 
       .Column("matricola"); 

      Map(x => x.Ruolo) 
       .Column("ruolo"); 

      HasMany(x => x.ListaSedi) 
       .AsBag() 
       .KeyColumns.Add("codice_sede") 
       .Not.LazyLoad() 
       .Cascade.SaveUpdate(); 

     } 
    } 

public class Map_Sede : FluentNHibernate.Mapping.ClassMap 
{ 
    public Map_Sede() 
    { 
     Table("TBA_Sede"); 

     Id(x => x.CodiceSede).Column("codice_sede").GeneratedBy.Assigned(); 

     Map(x => x.DescrizioneSede) 
      .Column("descrizione"); 


     References(prof => prof.Profilo) 
      .Column("codice_sede") 
      .Cascade.None() 
      .Inverse(); 

    } 

} 

Le La clé est que vous avez besoin du parent profilio pour enregistrer ses éléments enfants. Avoir les éléments enfants ne font rien à son parent. En outre, votre diagramme de table semble faux, profolio ne devrait pas avoir une clé pour sede, mais sede devrait avoir un fk à profolio.

+0

cela dure beaucoup de temps depuis que j'ai travaillé sur cette cartographie.Je ne sais vraiment pas si cela devrait être la bonne solution. – frabiacca