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:
(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?
J'ai essayé mais cela ne fonctionne pas :( – frabiacca
En outre, j'ai édité mon poste en écrivant la méthode que j'utilise pour enregistrer les entités – frabiacca
mise à jour réponse – Sly