J'ai une simple table de trois DB avec relation many-to-many.Comment faire pour enregistrer en cascade avec CompositeId dans NHibernate?
A(id, Name)
B(id, Name)
AB(AId, BId) references A and B
Les classes correspondantes:
public class A
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
public class B
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
public class AB
{
public virtual A A { get; set; }
public virtual B B { get; set; }
public override bool Equals(object obj) { /* routine */ }
public override int GetHashCode() { /* routine */ }
}
J'ai fait les correspondances avec Fluent NHibernate:
public class AMap : ClassMap<A>
{
public AMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name);
}
}
public class BMap : ClassMap<B> { /* The same as for A */ }
public class ABMap : ClassMap<AB>
{
public ABMap()
{
CompositeId()
.KeyReference(x => x.A, "AId")
.KeyReference(x => x.B, "BId");
}
}
Alors maintenant, je veux être en mesure de faire quelque chose comme ça
var a = new A { Name = "a1" };
var b = new B { Name = "b1" };
var ab = new AB { A = a, B = b };
//session.SaveOrUpdate(a);
//session.SaveOrUpdate(b);
session.SaveOrUpdate(ab);
Mais sur SaveOrUpdate Je reçois TransientObjectException. Donc, pour passer au-dessus je dois SaveOrUpdate A et B avant d'enregistrer l'AB. Mais il semble qu'il devrait y avoir l'autre moyen de persister ces objets dans un seul SaveOrUpdate.
Y a-t-il un moyen de pointer dans le mappage AB vers Cascade A et B lors de la sauvegarde?
MISE À JOUR:
J'ai retiré la liste des liens AB dans une classe pour plus de clarté. À l'origine, c'était:
public class A
{
public A()
{
LinkToB = new List<AB>();
}
public virtual int Id { get; set; }
public virtual string Name { get; set }
public virtual IList<AB> LinkToB { get; private set; }
}
public class AMap : ClassMap<A>
{
public AMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name);
HasMany(x => x.LinkToB)
.KeyColumn("AId")
.Inverse()
.Cascade.All()
.AsBag();
}
}
// inside the transaction
var a = new A { Name = "a1" };
var b = new B { Name = "b1" };
a.LinkToB.Add(new AB { A = a, B = b });
// session.SaveOrUpdate(b);
session.SaveOrUpdate(a);
Merci!
Merci pour la réponse rapide. J'ai enlevé cette relation pour la simplicité. Où dois-je entrer cette règle Cascade? – mipi
Je n'ai pas encore vraiment utilisé Fluent, mais lorsque vous utilisez des fichiers de mappage XML, l'attribut cascade doit être défini dans la collection. –
Et pour ma situation, il n'y a aucun moyen de mettre en cascade l'opération de sauvegarde ou est-ce là? – mipi