Comment dois-je configurer mes mappages pour éviter que NHibernate ne mette à jour les clés étrangères de mes entités enfants juste après les avoir insérées?NHibernate insert génère des mises à jour pour les éléments de collection
E.g. classe parent est mappée comme ceci:
class ParentMap : ClassMap<Parent>
{
public ParentMap()
{
Id(x => x.Id)
.GeneratedBy.Increment();
Map(x => x.Name);
HasMany(x => x.ChildNodes)
.KeyColumns.Add("Parent_id")
.Cascade.All();
}
}
Laissez Parent
ont un tas de Child
objets:
Parent p = new Parent("test");
p.ChildNodes.AddRange(GetSomeDummyNodes());
Quand je sauverai l'entité mère, ce produit SQL ressemble:
INSERT INTO [Parent] (Name, Id) VALUES (@p0, @p1); @p0 = 'test', @p1 = 0
INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = 'child1', @p1 = 0
INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = 'child2', @p1 = 1
INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = 'child3', @p1 = 2
UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 0, @p1 = 0
UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 1, @p1 = 0
UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 2, @p1 = 0
Si j'utilise Guid.Comb comme générateur de colonnes Id, il n'y a pas de mises à jour, les clés étrangères sont immédiatement définies dans les instructions INSERT
. Mais comme j'utilise la stratégie Increment
(qui crée également des ID du côté client, et qu'il n'y a pas d'instruction SELECT
qui lirait la valeur d'ID de la base de données, je ne vois pas pourquoi les ID ne pouvaient pas être définis immédiatement.)
Merci, qui l'a fait. – Groo