2016-05-16 67 views
0

我有一个类,它有一个抽象类的列表:当我更新NHibernate的不更新删除孤儿

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

但是:

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

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

我制订了酒吧,这样的Foo删除Bar它不会删除孤儿,但它确实将Bar的Foo_id列设置为NULL

我看了四周,看到的答案说给反演HasMany所以我尝试:

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

但是然后保存Bar时总是NULLFoo_id。这也是这种情况时,我尝试添加一个KeyColumn

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

让我看看你用来移除酒吧的代码 –

回答

0

使用这些映射:

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

要删除,你需要撇清从富从两个方面吧:

// 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); 

另一方面,要添加,您需要从两种方式关联对象:

// 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

这就是我正在做的事情,除了'Bar'没有对'Foo'的引用。 – maddisoj

+0

请参阅以下示例中Employee和Store之间的关系:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started –

+0

Bar如何知道它属于哪个Foo?只是FooID?根据经验,为了使级联正常工作,您需要将子对象引用到父级。我更新了我的答案以显示更完整的映射。 –