2016-05-16 6 views
0

Ich habe eine Klasse, die eine Liste von einer abstrakten Klasse hat:NHibernate nicht löschen Waisen auf Update

public class Foo 
{ 
    public int Id { get; set; } 
    public IList<Bar> Bars { get; set; } 
} 

public abstract class Bar 
{ 
    public int Id { get; set; } 
} 

ich die Bars als solche kartiert:

HasMany(f => f.Bars).Cascade.AllDeleteOrphans(); 

Jedoch, wenn ich ein Update Foo zum Entfernen einer Bar löscht es nicht die verwaisten, aber es setzt Foo_id Spalte Bar?

las ich um und sah, Antworten auf die inverse sagen die HasMany so habe ich versucht:

HasMany(f => f.Bars) 
    .Inverse() 
    .Cascade.AllDeleteOrphans(); 

Aber dann, wenn die Bar Spar hatte immer NULL als Foo_id. Dies war auch der Fall, wenn ich das Hinzufügen versuchte, ein KeyColumn:

HasMany(f => f.Bars) 
    .Inverse() 
    .KeyColumn("Foo_id") 
    .Cascade.AllDeleteOrphans(); 
+0

zeigen Sie mir den Code, den Sie verwenden, um eine Bar zu entfernen –

Antwort

0

diese Zuordnungen verwenden:

public class FooMap : ClassMap<Foo> 
{ 
    public FooMap() 
    { 
     Id(x => x.Id); 
     HasMany(f => f.Bars).Inverse().Cascade.AllDeleteOrphans(); 
    } 
} 
public class BarMap : ClassMap<Bar> 
{ 
    public BarMap() 
    { 
     Id(x => x.Id); 
     References(x => x.Foo); 
    } 
} 

zu entfernen, müssen Sie die Bar aus den foo aus beiden Möglichkeiten abgrenzen:

// get foo object 
var foo = dao.GetFooByID(1); 

var barToRemove = foo.Bars[0]; // find the first bar 

// disassociate the objects to properly trigger cascade deletion 
barToRemove.Foo = null; 
foo.Bars.Remove(barToRemove); 

dao.SaveFoo(foo); 

Auf der anderen Seite, um hinzuzufügen, müssen Sie die Objekte aus beiden Richtungen auch verknüpfen:

// get foo object 
var foo = dao.GetFooByID(1); 

var barToAdd = new Bar(); // new bar to add 

// associate the objects to properly trigger cascade save 
barToAdd.Foo = foo; 
foo.Bars.Add(barToAdd); 

dao.SaveFoo(foo); 
+0

Dies ist, was ich tat, außer "Bar" hat keinen Bezug auf 'Foo'. – maddisoj

+0

Siehe die Beziehung zwischen Employee und Store im folgenden Beispiel: https://github.com/jagregory/fluent-nibernate/wiki/Getting-started –

+0

Woher weiß eine Bar, welchem ​​Foo sie dann angehört? Nur die FooID? Damit die Kaskadierung ordnungsgemäß funktioniert, muss der Objektreferenz vom untergeordneten Element zum übergeordneten Objekt vorhanden sein. Ich habe meine Antwort aktualisiert, um vollständigere Zuordnungen anzuzeigen. –

Verwandte Themen