2010-11-26 34 views
0

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.)

Répondre

4

Je pense que vous devez jeter un oeil à la « inverse » attribut de mappage.

HasMany(x => x.ChildNodes) 
      .Inverse() 
      .KeyColumns.Add("Parent_id") 
      .Cascade.All(); 
+0

Merci, qui l'a fait. – Groo