J'utilise Fluent NHibernate et NHibernate.Core 3 beta 1. J'ai deux classes:saveOrUpdate() sur parent cartographié auto-définit tous les enfants clés étrangères à NULL
public class Promotion
{
public Promotion()
{
PromotionEntrants = new List<PromotionEntrant>();
}
public virtual int Id { get; set; }
[Required]
public virtual string Name { get; set; }
...
public virtual IList<PromotionEntrant> PromotionEntrants { get; set; }
}
public class PromotionEntrant
{
public virtual int Id { get; set; }
...
public virtual Promotion Promotion { get; set; }
}
J'utilise la cartographie automatique, qui génère le schéma que j'attends et les choses semblent fonctionner comme prévu pour la plupart.
J'ai l'action suivante (ASP.NET MVC 3 RC) pour l'enregistrement/la création Promotions:
[HttpPost]
public ActionResult SavePromo(Promotion promo)
{
if (ModelState.IsValid)
{
// .SaveOrUpdateCopy(promo) results in the same SQL
NhSession.SaveOrUpdate(promo);
NhSession.Flush();
}
...
}
Exécute l'attendu "Promotion de la mise à jour ..." requête, mais il exécute également les éléments suivants:
UPDATE [PromotionEntrant] SET PromotionId = null WHERE PromotionId = @p0;@p0 = 1 [Type: Int32 (0)]
Comment puis-je empêcher cela? Ma seule supposition est qu'il voit la liste vide sur l'objet Promotion (construit par ASP.NET MVC donc pas attaché à la Session NH), en prenant cela pour signifier qu'il n'y a pas d'enfant PromotionEntrants. Pour essayer d'empêcher cela, j'ai créé le remplacement de mappage automatique suivant, mais cela ne fait aucune différence.
public class PromotionMappingOverride : IAutoMappingOverride<Promotion>
{
public void Override(AutoMapping<Promotion> mapping)
{
mapping.HasMany(p => p.PromotionEntrants)
.Cascade.None();
}
}
Toute aide serait grandement appréciée.
Il semble que la définition du côté parent de la relation à Inverse était la clé. J'ai supprimé Cascade.None() et ajouté .Inverse() à PromotionMappingOverride et maintenant cette action met à jour uniquement la promotion comme prévu. Je suppose que le mappage automatique ne définit pas le côté parent comme Inverse par défaut? Merci pour l'astuce de la transaction. Je pensais que la transaction était inutile puisqu'elle ne devrait aboutir qu'à une mise à jour, mais je peux voir où cela supposerait trop dans certains cas. –
Je n'ai pas cherché à voir si FNH définit des relations bidirectionnelles avec inverse = true. Si ce n'est pas le cas, il y a une mise à jour supplémentaire pour le FK car les deux côtés parents et enfants pensent qu'ils gèrent la relation. Automack IMHO est fantastique pour commencer et itérer rapidement, mais je passe habituellement à ClassMap et les conventions une fois que le modèle s'est stabilisé. Content que je puisse vous aider et vous mettre sur la bonne voie pour trouver une solution. –