NHibernate不会在更新时删除孤儿

时间:2016-05-16 16:35:37

标签: c# nhibernate fluent-nhibernate

我有一个类,它有一个抽象类的列表:

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

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

我已经映射了条形码:

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

但是,当我更新Foo以删除Bar时,它不会删除孤儿,但它会将条形Foo_id列设置为NULL }?

我阅读并看到答案说要反转HasMany,所以我尝试了:

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

但是当保存BarNULL始终为Foo_id。当我尝试添加KeyColumn

时也是如此
HasMany(f => f.Bars)
    .Inverse()
    .KeyColumn("Foo_id")
    .Cascade.AllDeleteOrphans();

1 个答案:

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

要删除,您需要从两个方面取消与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);