2010-11-26 9 views
0

Wie soll ich meine Zuordnungen konfigurieren, um zu vermeiden, dass NHibernate die Fremdschlüssel meiner untergeordneten Entitäten sofort nach dem Einfügen aktualisiert?NHibernate insert generiert Updates für Sammlungselemente

z. Übergeordnete Klasse wird wie folgt abgebildet:

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(); 
    } 
} 

Lassen Parent haben eine Reihe von Child Objekte:

Parent p = new Parent("test"); 
p.ChildNodes.AddRange(GetSomeDummyNodes()); 

Wenn ich die übergeordnete Entität zu speichern, erzeugt SQL sieht wie folgt aus:

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 

Wenn ich Guid.Comb als Id-Spaltengenerator verwende, gibt es keine Updates, Fremdschlüssel werden sofort in INSERT-Anweisungen gesetzt. Aber da ich die Increment Strategie verwende (die auch IDs auf der Client-Seite erstellt, und es gibt keine SELECT Anweisung, die den ID-Wert aus der Datenbank lesen würde, sehe ich nicht, warum IDs nicht sofort gesetzt werden konnten.

Antwort

4

ich glaube, Sie werden einen Blick auf die ‚Inverse‘ Mapping Attribut nehmen.

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

Danke, das es tat. – Groo